> 物品来源,c#,wpf,xaml,combobox"/>

首页 > 解决方案 > 带有列表的 ComboBox 上的多个 SelectedValuePath/SelectedValue 绑定> 物品来源

问题描述

我有一个ComboBoxwhich 有一个ItemSourceof List<Tuple<long, long, string>>。在元组Item3中是一些用户友好的显示文本,Item1并且Item2是两个不同的(但一对一相关的)序列/键,当用户更改所选项目时,我需要在绑定对象上更新它们。

我可以像这样轻松地绑定这些序列之一:

<ComboBox ItemsSource="{Binding MyList, Mode=OneWay}"
          DisplayMemberPath="Item3"
          SelectedValuePath="Item1"
          SelectedValue="{Binding MyObject.FirstSequence, Mode=TwoWay}"

我想要实现的是:

<ComboBox ItemsSource="{Binding MyList, Mode=OneWay}"
          DisplayMemberPath="Item3"
          SelectedValuePath1="Item1"
          SelectedValue1="{Binding MyObject.FirstSequence, Mode=TwoWay}"
          SelectedValuePath2="Item2"
          SelectedValue2="{Binding MyObject.SecondSequence, Mode=TwoWay}"

是否有可能通过多重绑定来实现这样的目标?

然而,我已经尝试MyObject.SecondSequence在 setter 中进行设置,并且最初也是从数据库中填充的,我只需要在用户进行更改时更新它们,因此在 99% 的情况下这会增加相当多的额外和不必要的开销。MyObject.FirstSequenceMyObject.FirstSequenceMyObject.SecondSequence

我可能会更改MyObject.FirstSequence并更改MyObject.SecondSequence为包含两个序列的类,如下所示:

class Sequences
{
    string DisplayText { get; set; }
    long FirstSequence { get; set; }
    long SecondSequence { get; set; }
}

然后设置并绑定到ComboBox.ItemsSource,但这将意味着很多其他代码更改,我想先探索其他选项。List<Sequences>MyObject.Sequences

标签: c#wpfxamlcombobox

解决方案


视图模型可以具有SelectedTuple设置以下属性的属性MyObject

private Tuple<long, long, string> selectedTuple;

public Tuple<long, long, string> SelectedTuple
{
    get => selectedTuple;
    set
    {
        selectedTuple = value;
        MyObject.FirstSequence = selectedTuple.Item1;
        MyObject.SecondSequence = selectedTuple.Item2;
        NotifyPropertyChanged(nameof(SelectedTuple));
    }
}

它的设置如下所示 - 最初,但也可能在PropertyChanged附加到的事件处理程序中MyObject

SelectedTuple = MyList.FirstOrDefault(t =>
    t.Item1 == MyObject.FirstSequence && t.Item2 == MyObject.SecondSequence);

SelectedTuple属性将是这样的:

<ComboBox ItemsSource="{Binding MyList}"
          SelectedItem="{Binding SelectedTuple}"
          DisplayMemberPath="Item3"/>

推荐阅读