[英]ComboBox binding - receive notification on ComboBox item change
I want to display a list of ComboBoxes
, each ComboBox
gets its master list from its parent DataContext
but its value is bound to list that drives the list of ComboBoxes
我想显示一个
ComboBoxes
列表,每个ComboBox
从其父DataContext
获取其主列表,但其值绑定到驱动ComboBoxes
列表的列表
Essentially I have a master list of items ( AvailableRegisters
). 本质上,我有一个项目主列表(
AvailableRegisters
)。 I then display a list of ComboBoxes which basically equate to the currently selected Register
s 然后,我显示一个ComboBoxes列表,该列表基本上等于当前选择的
Register
。
What works 什么有效
SelectedRegisters
SelectedRegisters
的正确组合框数量 What doesnt work 什么不起作用
CollectionChanged
event CollectionChanged
事件 ViewModel Code: Here is my (shortened) ViewModel
code ViewModel代码:这是我的(缩短的)
ViewModel
代码
public class DialogViewModel : ViewModelBase
{
public ObservableCollection<IOViewModel> InputOutputList { get; set; }
public ObservableCollection<AvailableRegister> AvailableRegisters { get; set; }
}
public class IOViewModel
{
public ObservableCollection<AvailableRegister> SelectedRegisters { get; set; }
public IOViewModel()
{
this.Registers = new ObservableCollection<AvailableRegister>();
this.Registers.CollectionChanged += Registers_CollectionChanged;
}
void Registers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// Never hit when changing combo box
}
}
XAML XAML
<ItemsControl Grid.Column="4" ItemsSource="{Binding SelectedRegisters, Mode=TwoWay}" ItemTemplate="{StaticResource ItemTemplate}"></ItemsControl>
<DataTemplate x:Key="ItemTemplate">
<ComboBox SelectedValue="{Binding Path=DataContext, RelativeSource={RelativeSource Self},Mode=TwoWay}" ItemsSource="{Binding DataContext.AvailableRegisters, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate><!-- Display it here --></DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
The problem is you are only selecting an item from the ComboBox
from your ObservableCollection. 问题是您只从ObservableCollection的
ComboBox
选择一个项目。 You aren't changing the collection itself. 您无需更改集合本身。
If you want, create a property on your ViewModel
called SelectedItem
then bind your SelectedItem to it. 如果需要,可以在
ViewModel
上创建一个名为SelectedItem
的属性,然后将SelectedItem绑定到该属性。
public class IOViewModel
{
public ObservableCollection<AvailableRegister> SelectedRegisters { get; set; }
private AvailableRegister _selectedRegister;
public AvailableRegister SelectedRegister { get { return _selectedRegister; } set { _selectedRegister = value; } }
public IOViewModel()
{
this.Registers = new ObservableCollection<AvailableRegister>();
this.Registers.CollectionChanged += Registers_CollectionChanged;
}
void Registers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// Never hit when changing combo box
}
}
<DataTemplate x:Key="ItemTemplate">
<ComboBox SelectedItem="{Binding DataContext.SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" ItemsSource="{Binding DataContext.AvailableRegisters, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate><!-- Display it here --></DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.