我有一个包含大量项目的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,并启用蓝色和黄色。
答案 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的引用,因为它是调用该动作的控件。