C# 如果使用带MVVM模式的wpf ItemsControl,如何将一个ObservableCollection作为ItemsSource绑定到不同的组合框(模型)?

C# 如果使用带MVVM模式的wpf ItemsControl,如何将一个ObservableCollection作为ItemsSource绑定到不同的组合框(模型)?,c#,wpf,data-binding,combobox,wpf-controls,C#,Wpf,Data Binding,Combobox,Wpf Controls,我使用wpfitemscontrol元素和MVVM模式为不同的模型动态创建一个组合框列表。我希望有一个逻辑,比如如果我在一个组合框中选择一个元素,那么在所有其他组合框中它都不会出现。当我使用ItemsControl(ItemsSource-我的模型列表)并在VievModel中为其创建元素时,我很难做到这一点-绑定不起作用,它只在我为每个模型(模型类)而不是所有组合框(在ViewModel类中)都有一个组合框项目列表时才起作用。例如,我是否可以在ViewModel中为组合框项目设置1个Obser

我使用wpfitemscontrol元素和MVVM模式为不同的模型动态创建一个组合框列表。我希望有一个逻辑,比如如果我在一个组合框中选择一个元素,那么在所有其他组合框中它都不会出现。当我使用ItemsControl(ItemsSource-我的模型列表)并在VievModel中为其创建元素时,我很难做到这一点-绑定不起作用,它只在我为每个模型(模型类)而不是所有组合框(在ViewModel类中)都有一个组合框项目列表时才起作用。例如,我是否可以在ViewModel中为组合框项目设置1个ObservableCollection,并使用ItemsControl创建组合框

我的看法是:

    <ItemsControl ItemsSource="{Binding Items}" Grid.Row="1">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"  />
                            <ColumnDefinition Width="*"  />
                        </Grid.ColumnDefinitions>
                        <Label  Content="{Binding Name}" Grid.Column="0" />
                        <ComboBox  ItemsSource="{Binding ComboBoxItems}" Grid.Column="1"  
                                   SelectedItem="{Binding SelectedItem}"/>
</Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

视图模型:

public ObservableCollection<Model> Items { get; set; }

// if I add here public ObservableCollection<string> ComboBoxItems { get; set; } 
// binding isn't working, so I add it to Model class, but in it it does not work as I need.

public ViewModel()
{
Items = new ObservableCollection<Model>();
Items.Add(new Model {Name = "11111"});
Items.Add(new Model {Name = "22222"});
}
publicobservableCollection项{get;set;}
//如果我在这里添加public observeCollection ComboxItems{get;set;}
//绑定不起作用,所以我将其添加到模型类中,但在模型类中它不能按我的需要工作。
公共视图模型()
{
Items=新的ObservableCollection();
添加(新型号{Name=“11111”});
添加(新型号{Name=“22222”});
}
型号:

 public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
 public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }

public ObservableCollection<string> ComboBoxItems {get;set;}

public Model()
{
ComboBoxItems = new ObservableCollection<string>();
ComboBoxItems.Add("q");
ComboBoxItems.Add("w");
ComboBoxItems.Add("e");
ComboBoxItems.Add("r");
ComboBoxItems.Add("t");
ComboBoxItems.Add("y");
}
公共字符串名称
{
获取{return\u name;}
设置
{
_名称=值;
不动产变更(“名称”);
}
}
公共字符串SelectedItem
{
获取{return\u selectedItem;}
设置
{
_选择editem=值;
OnPropertyChanged(“SelectedItem”);
}
}
公共ObservableCollection ComboxItems{get;set;}
公共模型()
{
ComboBoxItems=新的ObservableCollection();
ComboBoxItems。添加(“q”);
ComboBoxItems。添加(“w”);
ComboBoxItems。添加(“e”);
ComboBoxItems。添加(“r”);
ComboBoxItems。添加(“t”);
ComboBoxItems。添加(“y”);
}

1 ViewModel中组合框项目的ObservableCollection,并使用ItemsControl创建组合框 这意味着你想将相同的ObservableCollection绑定到你的
ItemsControl
ComboBox
,如果没有,请在评论中告诉我

Ans



我将
项绑定到
组合框
1 ViewModel中组合框项的ObservableCollection,并使用ItemsControl创建组合框
这意味着你想将相同的ObservableCollection绑定到你的
ItemsControl
ComboBox
,如果没有,请在评论中告诉我

Ans



我将
项目
绑定到
组合框

为了实现您的目标,您可以筛选
组合框项目
的视图。您可以通过单源单视图方式完成,只需更改
ViewModel
的构造函数,如:

public ViewModel()
{
    Items = new ObservableCollection<Model>();
    Items.Add(new Model {Name = "11111"});
    Items.Add(new Model {Name = "22222"});
    Items.Add(new Model {Name = "33333"});

    foreach (var item in Items)
    {
        CollectionViewSource.GetDefaultView(item.ComboBoxItems).Filter =
            (x) => !Items.Where((y) => y != item).Select(y => y.SelectedItem).Any(y => y == (string)x);

        item.PropertyChanged += (s, e) =>
        {
            foreach (var obj in Items.Where((x) => x != item).Select(x => x.ComboBoxItems))
                CollectionViewSource.GetDefaultView(obj).Refresh();
        };
    }    
}
公共视图模型()
{
Items=新的ObservableCollection();
添加(新型号{Name=“11111”});
添加(新型号{Name=“22222”});
添加(新型号{Name=“33333”});
foreach(项目中的var项目)
{
CollectionViewSource.GetDefaultView(item.ComboBoxItems).Filter=
(x) =>!Items.Where((y)=>y!=item)。选择(y=>y.SelectedItem)。任意(y=>y==(字符串)x);
item.PropertyChanged+=(s,e)=>
{
foreach(Items.Where((x)=>x!=item)中的var obj。选择(x=>x.comboxitems))
CollectionViewSource.GetDefaultView(obj.Refresh();
};
}    
}
或者,您也可以以单源多视图的方式执行此操作,这允许您放弃模型

public class ViewModel
{
    private List<string> _comboBoxItems = new List<string> { "q", "w", "e", "r", "t", "y" };
    private List<ICollectionView> _comboBoxViews = new List<ICollectionView>();

    public ObservableCollection<string> Names { get; set; } = new ObservableCollection<string> { "111", "222", "333" };

    public ICollectionView ComboBoxView
    {
        get
        {
            var view = new CollectionViewSource { Source = _comboBoxItems}.View;
            _comboBoxViews.Add(view);
            view.MoveCurrentToPosition(-1);

            view.Filter = (x) => !_comboBoxViews.Where(y => y != view).Any(y => (string)y.CurrentItem == (string)x);

            view.CurrentChanged += (s, e) =>
            {
                foreach (var v in _comboBoxViews.Where(x => x != view))
                    v.Refresh();
            };

            return view;
        }
    }
}

<ItemsControl ItemsSource="{Binding Names}" Grid.Row="1">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"  />
                    <ColumnDefinition Width="*"  />
                </Grid.ColumnDefinitions>
                <Label  Content="{Binding}" Grid.Column="0" />
                <ComboBox  ItemsSource="{Binding DataContext.ComboBoxView, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                           Grid.Column="1"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
公共类视图模型
{
私有列表_comboBoxItems=新列表{“q”、“w”、“e”、“r”、“t”、“y”};
私有列表_comboBoxViews=新列表();
公共ObservableCollection名称{get;set;}=新的ObservableCollection{“111”、“222”、“333”};
公共ICollectionView组合框视图
{
得到
{
var view=new CollectionViewSource{Source=\u comboBoxItems}.view;
_comboBoxViews.Add(视图);
视图。移动当前位置(-1);
view.Filter=(x)=>!\u ComboboxView.Where(y=>y!=视图)。任意(y=>(字符串)y.CurrentItem==(字符串)x);
view.CurrentChanged+=(s,e)=>
{
foreach(comboboxview.Where(x=>x!=视图)中的变量v)
v、 刷新();
};
返回视图;
}
}
}

为了实现您的目标,您可以筛选
ComboBoxItems
的视图。您可以通过单源单视图方式完成,只需更改
ViewModel
的构造函数,如:

public ViewModel()
{
    Items = new ObservableCollection<Model>();
    Items.Add(new Model {Name = "11111"});
    Items.Add(new Model {Name = "22222"});
    Items.Add(new Model {Name = "33333"});

    foreach (var item in Items)
    {
        CollectionViewSource.GetDefaultView(item.ComboBoxItems).Filter =
            (x) => !Items.Where((y) => y != item).Select(y => y.SelectedItem).Any(y => y == (string)x);

        item.PropertyChanged += (s, e) =>
        {
            foreach (var obj in Items.Where((x) => x != item).Select(x => x.ComboBoxItems))
                CollectionViewSource.GetDefaultView(obj).Refresh();
        };
    }    
}
公共视图模型()
{
Items=新的ObservableCollection();
添加(新型号{Name=“11111”});
添加(新型号{Name=“22222”});
添加(新型号{Name=“33333”});
foreach(项目中的var项目)
{
CollectionViewSource.GetDefaultView(item.ComboBoxItems).Filter=
(x) =>!Items.Where((y)=>y!=item)。选择(y=>y.SelectedItem)。任意(y=>y==(字符串)x);
item.PropertyChanged+=(s,e)=>
{