如何使用 LINQ 禁用已在组合框之间选择的项目?

How to disable items that already selected between to combobox using LINQ?

我有一个 客户列表 和两个 ComboBox 名为 cmbList1, cmbList2.

客户名单:

加载到 cmbList1 和 select Clients 之一的列表,例如玛丽.

我的问题: 如何在没有 Mary 的情况下加载 cmbList2(Mary 在 cmbList1 上 selected ) 使用 Linq?

cmbList2 项目来源必须是这样的:

在您的 ViewModel 中,您创建了一个 ObservableCollection:

private ObservableCollection<Client> MyFirstList = new ObservableCollection<Client>();
public ObservableCollection<Client> myFirstList
{
    get { return myFirstList; }
    set
    {
        this.myFirstList=value;
        NotifyPropertyChanged("MyFirstList");
    }
}

然后你创建一个 ICollectionView :

public ICollectionView MySecondListView { get; set; }

当你调用你的 ViewModel 时,你需要 "link" 视图到第一个列表:

MySecondListView = CollectionViewSource.GetDefaultView(MyFirstList);

所以 MySecondListView 将只是您第一个列表中的一个 "copy"。

第 2 步:过滤器

您需要从第一个 ComboBox 绑定选定的元素,并且每次它的值发生变化时,对您的 ICollectionView 应用一个过滤器:

private Client selectedClient = null;
public Client SelectedClient
{
    get { return selectedClient; }
    set
    {
        this.selectedClient = value;
        this.NotifyPropertyChanged("SelectedClient");
        MySecondListView.Filter=new Predicate<object>(GetFilteredView);
    }
}
private bool getFilteredView(object obj)
{
    Client client = (Client)obj;
    if(this.SelectedClient!=null && client==this.SelectedClient) return false;
    return true;
}

这样一来,第二个列表将return与第一个列表相同,没有选中的项目。

最后 XAML :

<ComboBox x:Name="FirstComboBox" ItemsSource="{Binding MyFirstList}" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValue="{Binding SelectedClient, UpdateSourceTrigger=PropertyChanged}"/>

<ComboBox x:Name="SecondComboBox" ItemsSource="{Binding MySecondListView}" DisplayMemberPath="Name" SelectedValuePath="ID"/>

编辑:没有 MVVM:

在这种情况下,您可以使用 ComboBox.SelectedIndexComboBox.SelectedItem 并执行类似的操作:

  • 在你的XAML中使用事件"SelectionChanged"

然后你可以做一个这样的函数:

private void MyFirstComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MySecondList.Clear();
    for(int i=0;i<MyFirstList.Count();i++)
    {
        if(i!=MyComboBox.SelectedIndex) MySecondList.Add(MyFirstList[i];
        //if(MyFirstList[i]!=MyComboBox.SelectedItem) MySecondList.Add(MyFirstList[i];
    }
}

但是你需要定义 2 个独立的 ObservableCollection。