Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组合框绑定-接收组合框项目更改通知_C#_Silverlight_Xaml - Fatal编程技术网

C# 组合框绑定-接收组合框项目更改通知

C# 组合框绑定-接收组合框项目更改通知,c#,silverlight,xaml,C#,Silverlight,Xaml,我想显示一个组合框列表,每个组合框从其父级数据上下文获取其主列表,但其值绑定到驱动组合框列表的列表 基本上我有一个项目的主列表(AvailableRegisters)。然后,我显示一个组合框列表,基本上等同于当前选择的寄存器s 什么有效 我可以看到每个selectedRegister的组合框的正确数量 什么不起作用 当我从组合框中选择另一项时,我不会收到CollectionChanged事件 视图模型代码: 这是我的(缩写)ViewModelcode public class Dialo

我想显示一个
组合框列表
,每个
组合框
从其父级
数据上下文
获取其主列表,但其值绑定到驱动
组合框列表的列表

基本上我有一个项目的主列表(
AvailableRegisters
)。然后,我显示一个组合框列表,基本上等同于当前选择的
寄存器
s

什么有效

  • 我可以看到每个
    selectedRegister的组合框的正确数量
什么不起作用

  • 当我从组合框中选择另一项时,我不会收到
    CollectionChanged
    事件
视图模型代码: 这是我的(缩写)
ViewModel
code

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
    }
}
public类对话框viewmodel:ViewModelBase
{
公共ObservableCollection InputOutputList{get;set;}
公共ObservableCollection可用注册表{get;set;}
}
公共类IOViewModel
{
公共ObservableCollection SelectedRegisters{get;set;}
公共IOViewModel()
{
this.Registers=新的ObservableCollection();
this.Registers.CollectionChanged+=寄存器\u CollectionChanged;
}
无效寄存器\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//更改组合框时从不点击
}
}
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中的
组合框中选择了一项。您没有更改集合本身

如果需要,请在
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
    }
}
公共类IOViewModel
{
公共ObservableCollection SelectedRegisters{get;set;}
私人可用注册器(u selectedRegister);;
public AvailableRegister SelectedRegister{get{return{u SelectedRegister;}set{u SelectedRegister=value;}
公共IOViewModel()
{
this.Registers=新的ObservableCollection();
this.Registers.CollectionChanged+=寄存器\u CollectionChanged;
}
无效寄存器\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//更改组合框时从不点击
}
}



我不太明白,你能把它和我的
ViewModel
名称放在一起吗?Thanks@Chris我已经编辑过了。可能需要一点粗呢。这个想法是,当您从组合框中选择一个项目时,您将看到它在ViewModel上的SelectedItem的set方法中被设置。我需要一个SelectedRegister的列表,而不仅仅是一个列表。因此,
observetecollection
。我根据该
observedcollection
<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>