所以你想使用列表框,本质上,在网格上设置一个过滤器?
请注意,下面的 LBItem 和 ViewModel 需要实现 INotifyPropertyChanged 并在属性更改时触发它们的 PropertyChanged 事件,否则这些都不起作用。但为了清楚起见,我省略了样板。
有很多方法可以做到这一点。
C#
public class LBItem {
public ViewModel Parent { get; set; }
public IEnumerable<String> SubItems {
get {
return Parent.List2.Where( /* filter items here */ );
}
}
}
public class ViewModel {
//
public ObservableCollection<LBItem> LBItems { get; set; }
public LBItem SelectedLBItem { get; set; }
public List<String> List2 { get; set; }
}
XAML
<ListBox
Name="MasterLB"
ItemsSource="{Binding LBItems}"
SelectedItem={Binding SelectedLBItem}"
/>
<DataGrid
ItemsSource="{Binding ElementName=MasterLB, Path=SelectedItem.SubItems}"
/>
无论您是否将MasterLB.SelectedItem 绑定到 ViewModel 上的属性,这都将起作用。但是只要绑定MasterLB.SelectedItem,就可以在ViewModel 上轻松地将DataGrid.ItemsSource 绑定到SelectedLBItem.SubItems,如下所示:
<DataGrid
ItemsSource="{Binding Path=SelectedLBItem.SubItems}"
/>
但是 ElementName 绑定对于很多事情都很方便,所以我给你两个。
你也可以这样做:
C#
public class LBItem {
public IEnumerable<String> Filter(IEnumerable<String> fullList) {
return fullList.Where( /* filter items here */ );
}
}
public class ViewModel {
public ObservableCollection<LBItem> LBItems { get; set; }
private LBItem _selectedItem;
public LBItem SelectedLBItem {
get { return _selectedItem; }
set {
_selectedItem = value;
List2Filtered = (null == _selectedItem)
? new List<String>()
: _selectedItem.Filter(List2).ToList();
}
}
public List<String> List2 { get; set; }
public List<String> List2Filtered { get; set; }
}
XAML
<ListBox
Name="MasterLB"
ItemsSource="{Binding LBItems}"
SelectedItem={Binding SelectedLBItem}"
/>
<DataGrid
ItemsSource="{Binding List2Filtered}"
/>