ComboBox 上的多个 SelectedValuePath/SelectedValue 绑定与 List<Tuple<long, long, string>> ItemsSource

Multiple SelectedValuePath/SelectedValue binding on ComboBox with List<Tuple<long, long, string>> ItemsSource

我有一个 ComboBox,它的 ItemSourceList<Tuple<long, long, string>>。在元组 Item3 中是一些用户友好的显示文本,Item1Item2 是两个不同的(但一对一相关)sequences/keys 我需要更新用户更改所选项目时的绑定对象。

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

<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.FirstSequence 的 setter 中设置 MyObject.SecondSequence 但是 MyObject.FirstSequenceMyObject.SecondSequence 最初也是从数据库中填充的,我只需要在用户进行更改时更新它们,因此在 99% 的情况下这会增加相当多的额外和不必要的开销。

我可能会将 MyObject.FirstSequenceMyObject.SecondSequence 更改为包含两个序列的 class,如下所示:

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

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

视图模型可以有一个 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));
    }
}

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

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

SelectedTuple 属性 会像这样:

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