C# 基于窗口中另一个元素的DataContext禁用ListBoxItem

C# 基于窗口中另一个元素的DataContext禁用ListBoxItem,c#,silverlight,C#,Silverlight,我有一个列表框,里面有很多项目。我还有另一个列表框,里面有很多项目。这两个项目相互关联,如果用户从ListBox1中选择一个项目,则会在ListBox2中创建一个相应的项目。如果该项存在于ListBox2中,我希望禁用ListBox1中的相应项,以便用户只能在ListBox2中拥有其中一项 我注意到Silverlight与WPF相比存在一些不足之处,即不能使用ItemContainerStyle绑定,也不能使用RelativeSource。。。这正是尝试这样做时首先想到的两件事(在ListBox

我有一个列表框,里面有很多项目。我还有另一个列表框,里面有很多项目。这两个项目相互关联,如果用户从ListBox1中选择一个项目,则会在ListBox2中创建一个相应的项目。如果该项存在于ListBox2中,我希望禁用ListBox1中的相应项,以便用户只能在ListBox2中拥有其中一项

我注意到Silverlight与WPF相比存在一些不足之处,即不能使用ItemContainerStyle绑定,也不能使用RelativeSource。。。这正是尝试这样做时首先想到的两件事(在ListBox DataContext的相对源上有一个空到启用的转换器(此DataContext将保存ListBox2的项集合)

例如:

ListBox1包含以下项:

Red
Blue
Yellow
ListBox2当前有1项:

RedCar

我有对应于RedCar的红色,因此希望在ListBox1中禁用红色,并启用蓝色和黄色。

您可以使用两套。一套从{Red,Blue,Yellow}开始对于要捕获以执行操作的每个事件,您可能会编写代码从其中一个集合中删除并添加到另一个集合中

考虑到

var Box2Collection = new ObservableCollection<Color>();
var Box2Collection = new ObservableCollection<Color>();

您也可以编写代码以正确的顺序插入它们,或者使用来保持列表的排序。

您可以使用从列表框中获取
SelectedItem
的转换器,为项目的
IsEnabled
属性添加绑定

 public object ConvertTo(object value, Type targetType,
     object parameter, CultureInfo cultureInfo)
 {
     Vehicle vehicle = (Vehicle)parameter;
     if (vehicle == null) return true;

     Color currentColor = (Color)value;
     return vehicle.Color != currentColor;
 }

最后,当用户单击“添加新”按钮时,我创建了一个事件。此时会调用一个事件,查看第二个列表框中的系统,然后禁用任何相应的项。我通常不希望在ViewModel中有UI样式的代码,但在这种特殊情况下,它是一次性的,工作得相当好。由于我是数据绑定,因此其中实际上只有一段UI代码,即使用以下方法启用/禁用ListBoxItem:

var lbi=(ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(成员);

我有一个对列表框的引用,因为它是调用操作的控件

 public object ConvertTo(object value, Type targetType,
     object parameter, CultureInfo cultureInfo)
 {
     Vehicle vehicle = (Vehicle)parameter;
     if (vehicle == null) return true;

     Color currentColor = (Color)value;
     return vehicle.Color != currentColor;
 }