簡體   English   中英

ComboBox綁定-接收有關ComboBox項更改的通知

[英]ComboBox binding - receive notification on ComboBox item change

我想顯示一個ComboBoxes列表,每個ComboBox從其父DataContext獲取其主列表,但其值綁定到驅動ComboBoxes列表的列表

本質上,我有一個項目主列表( AvailableRegisters )。 然后,我顯示一個ComboBoxes列表,該列表基本上等於當前選擇的Register

什么有效

  • 我可以看到每個SelectedRegisters的正確組合框數量

什么不起作用

  • 當我從組合框中選擇另一個項目時,我沒有收到CollectionChanged事件

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

<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>

問題是您只從ObservableCollection的ComboBox選擇一個項目。 您無需更改集合本身。

如果需要,可以在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