ComboBox 上的多个 SelectedValuePath/SelectedValue 绑定与 List<Tuple<long, long, string>> ItemsSource
Multiple SelectedValuePath/SelectedValue binding on ComboBox with List<Tuple<long, long, string>> ItemsSource
我有一个 ComboBox
,它的 ItemSource
为 List<Tuple<long, long, string>>
。在元组 Item3
中是一些用户友好的显示文本,Item1
和 Item2
是两个不同的(但一对一相关)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.FirstSequence
和 MyObject.SecondSequence
最初也是从数据库中填充的,我只需要在用户进行更改时更新它们,因此在 99% 的情况下这会增加相当多的额外和不必要的开销。
我可能会将 MyObject.FirstSequence
和 MyObject.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));
}
}
它的设置如下所示 - 最初,但也可能在附加到 MyObject
的 PropertyChanged
事件处理程序中设置。
SelectedTuple = MyList.FirstOrDefault(t =>
t.Item1 == MyObject.FirstSequence && t.Item2 == MyObject.SecondSequence);
SelectedTuple
属性 会像这样:
<ComboBox ItemsSource="{Binding MyList}"
SelectedItem="{Binding SelectedTuple}"
DisplayMemberPath="Item3"/>
我有一个 ComboBox
,它的 ItemSource
为 List<Tuple<long, long, string>>
。在元组 Item3
中是一些用户友好的显示文本,Item1
和 Item2
是两个不同的(但一对一相关)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.FirstSequence
和 MyObject.SecondSequence
最初也是从数据库中填充的,我只需要在用户进行更改时更新它们,因此在 99% 的情况下这会增加相当多的额外和不必要的开销。
我可能会将 MyObject.FirstSequence
和 MyObject.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));
}
}
它的设置如下所示 - 最初,但也可能在附加到 MyObject
的 PropertyChanged
事件处理程序中设置。
SelectedTuple = MyList.FirstOrDefault(t =>
t.Item1 == MyObject.FirstSequence && t.Item2 == MyObject.SecondSequence);
SelectedTuple
属性 会像这样:
<ComboBox ItemsSource="{Binding MyList}"
SelectedItem="{Binding SelectedTuple}"
DisplayMemberPath="Item3"/>