我将有一个 ViewModel,它是 Window/UserControl/etc 的 DataContext,这些控件都分组在其中。然后设置 ClassA 的集合加上 3 个 SelectedItem 属性。在 SelectedItem 属性中,您需要将下一个属性设置为 null 或默认值。
private ObservableCollection<ClassA> _CollectionOfA;
public ObservableCollection<ClassA> CollectionOfA
{
get { return _CollectionOfA; }
set
{
if (value == _CollectionOfA)
return;
_CollectionOfA = value;
RaisePropertyChanged(() => CollectionOfA);
}
}
private ClassA _SelectedClassA;
public ClassA SelectedClassA
{
get { return _SelectedClassA; }
set
{
if (value == _SelectedClassA)
return;
_SelectedClassA = value;
SelectedClassB = null; //Or default this to first item in the list, etc.
RaisePropertyChanged(() => SelectedClassA);
}
}
//Repeat SelectedClassA pattern for SelectedClassB/SelectedClassC
public ClassB SelectedClassB { get; set; }
public ClassC SelectedClassC { get; set; }
然后在您的绑定中,您将使用 SelectedClassA.CollectionOfClassB 属性作为第二个 DataGrid 的 ItemsSource 等。
<DataGrid ItemsSource="{Binding CollectionOfClassA}" SelectedItem="{Binding SelectedClassA}">
//columns defined here
</DataGrid>
<DataGrid ItemsSource="{Binding SelectedClassA.CollectionOfClassB}" SelectedItem="{Binding SelectedClassB}">
//columns defined here
</DataGrid>
<DataGrid ItemsSource="{Binding SelectedClassB.CollectionOfClassC}" SelectedItem="{Binding SelectedClassC}">
//columns defined here
</DataGrid>
编辑:
第一个选项是我的KISS 方法。另一种选择是使用MVVM Light 之类的东西,它通过messenger 类实现weak event pattern。在第二个 ViewModel 的构造函数中,您注册以侦听第一个 ViewModel 中 SelectedItem 的更改。在第一个 ViewModel 的设置器中,您发送一条消息,说明 SelectedItem 已更改。这是 ClassBViewModel 的示例(ClassAViewModel 只需要其 SelectedClassA 设置器来发送消息,构造函数中没有侦听器。而 ClassCViewModel 会侦听但不需要发送)。
public class ClassBViewModel : ViewModelBase
{
private ClassA _SelectedClassA;
public ClassA SelectedClassA
{
get { return _SelectedClassA; }
set
{
if (value == _SelectedClassA)
return;
_SelectedClassA = value;
RaisePropertyChanged(() => SelectedClassA);
}
}
private ClassB _SelectedClassB;
public ClassB SelectedClassB
{
get { return _SelectedClassB; }
set
{
if (value == _SelectedClassB)
return;
var oldValue = _SelectedClassB;
_SelectedClassB = value;
Messenger.Default.Send(new PropertyChangedMessage<ClassB>(oldValue, value, "SelectedClassB"));
RaisePropertyChanged(() => SelectedClassB);
}
}
public ClassBViewModel()
{
Messenger.Default.Register<PropertyChangedMessage<ClassA>>(this, (message) => SelectedClassA = message.NewValue);
}
}
DataGrid 的 ClassBView xaml 看起来仍然相同:
<DataGrid ItemsSource="{Binding SelectedClassA.CollectionOfClassB}" SelectedItem="{Binding SelectedClassB}">
//columns defined here
</DataGrid>