简体   繁体   English

ComboBox绑定-接收有关ComboBox项更改的通知

[英]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 什么有效

  • I can see the correct number of ComboBoxes per SelectedRegisters 我可以看到每个SelectedRegisters的正确组合框数量

What doesnt work 什么不起作用

  • When I select another item from the combobox I do not receive a 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM