所以,你想使用列表框,基本上,在網格上設置一個過濾器?
請注意,下面的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
對視圖模型的屬性。但只要你有約束力MasterLB.SelectedItem
,你可以很容易地結合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}"
/>