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

时间:2011-03-25 14:49:02

标签: c# silverlight

我有一个包含大量项目的ListBox。我还有另一个ListBox,里面有一堆项目。这两者在其他方面相互关联,因为如果用户从ListBox1中选择一个项目,则将在ListBox2中创建相应的项目。如果项目存在于ListBox2中,我希望禁用ListBox1中的相应项目,以便用户只能在ListBox2中拥有这些项目之一。

我注意到Silverlight与WPF相比存在一些不足之处,因为你不能使用ItemContainerStyle绑定,并且你不能使用RelativeSources ......这些正是试图做的时候首先想到的两件事(在ListBox DataContext的相对源上有一个null-enabled-converter转换器(此DataContext将保存ListBox2的项集合)。

例如:

ListBox1有项目:

Red
Blue
Yellow

ListBox2目前有1个项目:

RedCar

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

3 个答案:

答案 0 :(得分:0)

您可以使用2套ObservableCollection。一个以{Red,Blue,Yellow}开头,另一个为空。在您捕获的每个事件上进行操作时,可能SelectionChanged,您编写代码以从其中一个集合中删除并添加到另一个集合中。

考虑

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

在SelectionChanged事件处理程序

Box2Collection.Add(selectedColor);
Box1Collection.Remove(selectedColor);

您也可以编写代码以正确的顺序插入代码,或使用ICollectionView对列表进行排序。

答案 1 :(得分:0)

您可以使用从列表框中取出IsEnabled的转换器为商品的SelectedItem属性添加绑定。

 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;
 }

答案 2 :(得分:0)

当用户点击“添加新”按钮时,我最终创建了一个事件。此时会调用一个事件来查看第二个列表框中的系统,然后禁用任何相应的项目。我通常不喜欢在ViewModel中使用UI-esque代码,但在这种特殊情况下它是一次性的,并且运行得相当好。由于我是数据绑定,因此实际上只有一段UI代码,并且使用ListBoxItem来启用/禁用:

var lbi = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(member);

我有一个对ListBox的引用,因为它是调用该动作的控件。