如何使用 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.SelectedIndex
或 ComboBox.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。
我有一个 客户列表 和两个 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.SelectedIndex
或 ComboBox.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。