这是一个相当广泛的问题,因此没有明确的答案。我将描述我将如何处理这个问题。请记住,这可能不是最好的解决方案。
为了呈现依赖于第一个组合框的控件,请使用数据模板和不同的视图模型。在你的主视图的资源部分,或者如果你定义了一个外部资源,写如下内容:
<DataTemplate DataType="{x:Type vm:YourViewModel}"> <vw:YourView /> </DataTemplate>
您必须导入包含您的视图模型和视图的命名空间(此处为 vm: 和 vw:)。使用内容控件,您可以根据视图模型呈现视图:
<ContentControl Content="{Binding CurrentViewModel}"></ContentControl>
在您的代码中,您必须有一个可以绑定到的 ViewModel。根据第一个组合框的选择,您现在可以在后面的代码中换出 ViewModel 以渲染相关的组合框 - 或者什么都不做!
为了说明,让我提供一些示例代码。让我们从主视图模型开始。那是包含第一个组合框绑定到的集合的那个(例如字符串“消息日期”,“网关”......)
public class MainViewModel : BaseViewModel {
public IObservableCollection comboBoxItems;
public BaseViewModel ControlViewModel {get; set;}
private String selectedItem;
public String SelectedItem {
get {
return selectedItem;
}
set {
selectedItem = value;
OnPropertyChanged("SelectedItem");
ChangeControls();
}
}
private void ChangeControls(){
switch(selectedItem):
//swap out the control view model here e.g.
controlViewModel = new GateWayControlViewModel();
}
}
顺便说一句,BaseViewModel 是所有视图模型都继承自的抽象类。它实现了 INotifyPropertyChanged。
在您的主视图中,将内容控件绑定到控件视图模型以及第一个组合框就足够了:
如前所述,您可以在 resources.xaml 中定义数据模板。
<DataTemplate DataType="{x:Type vw:GatewayControlViewModel}"> <vw:GatewayView /> </DataTemplate>
如果主视图中的 ContentControl 绑定到的 ViewModel 等于 GateWayControlViewModel,这将呈现 GateWayView。最后,您的 GatewayView 可能如下所示:
<ComboBox ItemsSource="{Binding Gateways}"
SelectedValue="{Binding SelectedGateway}" />
显然,您必须确保您的 GatewayControlViewModel 确实包含视图中提到的项目和属性。它还需要从 BaseViewModel 派生。
我希望这能给你一些想法。此外,您可能会发现this link 很有用(因为它包含一些关于如何处理 MVVM 的非常有用的提示)。