【发布时间】:2016-09-14 18:53:30
【问题描述】:
目标是拥有多个Combobox,一旦该项目在Combobox中的任何一个中被选中,就应该从其他Comboboxes中移除或隐藏以供选择。
只要在任何Comboboxes 上更改选择,我就可以更改源。但是问题是当我从ItemsSource 中删除所选项目时,项目已从所有来源中删除,包括我选择的来源。
这里是示例
xaml
<StackPanel>
<ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" />
<ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" />
<ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" />
<ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" />
</StackPanel>
代码隐藏
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<string> s = new ObservableCollection<string>();
s.Add("item1");
s.Add("item2");
s.Add("item3");
s.Add("item4");
s.Add("item5");
s.Add("item6");
DataContext = new MainViewModel() { ComboboxItems = s , SelectedItem = "item2" };
}
}
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<string> comboboxitems;
public ObservableCollection<string> ComboboxItems
{
get { return comboboxitems; }
set { comboboxitems = value; OnPropertyChanged("ComboboxItem"); }
}
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
comboboxitems.Remove(value); //here removing selected item from itemssource
OnPropertyChanged("SelectedItem");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propname)
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propname));
}
}
我知道每个Combobox 可以有多个集合,但如果Combobox 的数量增加,这可能会占用大量内存。
希望,在 WPF 中应该有一种简单的方法来实现这一点。
【问题讨论】:
-
好吧,在这种情况下,您必须创建多个 SelectedItem 属性,我相信每个组合框都有一个。例如SelectedItem1、SelectedItem2等,但ItemsSource可以共享。
-
使用 CollectionView 或 CollectionViewSource- 代表您的实际来源。这将允许通过 View 属性共享公共源,并且您可以为每个 CollectionView 拥有不同的选定项(CurrentItem)。
-
@adminSoftDK 是的,我们可以。但是如何从其他
Combobox上删除或限制该项目? -
每个组合框都需要一个样式和触发器来执行此操作。因此,如果当前项目等于 OtherSelectedItem 则对该项目应用一些东西。我现在没有时间制作代码示例。但希望你能明白。
标签: wpf xaml data-binding combobox observablecollection