最好的方法是改变你的绑定焦点ListCollectionViews因为这将允许你管理光标下面是一个例子:
视图模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
namespace BindingSample
{
public class ViewModel
{
private string[] _items = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public ViewModel()
{
List1 = new ListCollectionView(_items);
List2 = new ListCollectionView(_items);
List3 = new ListCollectionView(_items);
List1.CurrentChanged += (sender, args) => SyncSelections(List1);
List2.CurrentChanged += (sender, args) => SyncSelections(List2);
List3.CurrentChanged += (sender, args) => SyncSelections(List3);
}
public ListCollectionView List1 { get; set; }
public ListCollectionView List2 { get; set; }
public ListCollectionView List3 { get; set; }
private void SyncSelections(ListCollectionView activeSelection)
{
foreach (ListCollectionView view in new[] { List1, List2, List3 })
{
if (view != activeSelection && view.CurrentItem == activeSelection.CurrentItem)
view.MoveCurrentTo(null);
}
}
}
}
查看
<Window x:Class="ContextMenuSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel Orientation="Vertical">
<ListBox ItemsSource="{Binding List1}" />
<ListBox ItemsSource="{Binding List2}" />
<ListBox ItemsSource="{Binding List3}" />
</StackPanel>
</Window>
这将使您只能选择一个项目。目前它是硬编码的,但对于其他列表可以很容易地变得更加灵活。
你说这份清单是静态的,对吧?所以你不应该只能删除选定的项目,它会自动更新所有行? – McGarnagle
我不希望它从列表中删除;如果之前还有另一个与此项目一起选择的ComboBox,则必须删除此ComboBox选择。 – iop
为什么不使用所有项目“AllItems”的列表,一个用于所选项目“SeledtedItems”,第三个项目使用可用项目“AvailableItems”,后者是“AllItems”减去“SelectedItems”的计算。该列表是您绑定到ComboBoxes的ItemsSource的列表。 每当“SelectedItems”更改时,都会在“AvailableItems”上触发NotifyPropertyChanged。 – SvenG