0

のリストを表示したいのですがComboBoxes、それぞれComboBoxがその親からマスター リストを取得しDataContextますが、その値はのリストを駆動するリストにバインドされていますComboBoxes

基本的に、アイテムのマスター リスト ( AvailableRegisters) があります。Register次に、基本的に現在選択されているsに相当する ComboBoxes のリストを表示します

機能するもの

  • あたりの ComboBoxes の正しい数を確認できます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>
4

1 に答える 1

1

ComboBox問題は、ObservableCollection から項目のみを選択していることです。コレクション自体を変更しているわけではありません。

必要に応じて、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>
于 2013-11-01T17:12:24.960 に答える