我是mvvm和WPF的新手,所以我正在寻找一些指导来实现以下目标。
我想在我的应用中创建一个搜索部分,根据用户选择的条件构建搜索选项。
例如,搜索的第一个组合框提供了最高级别的选择:
消息日期
网关
方向
等。 ......
第二部分是我的操作员
因此,例如,如果选择了“消息日期”,则会向用户提供另一个选项组合框
介于
之间上周
上个月
Etc ..
搜索的最后一部分基于上面的运算符,因此如果选择了Is Between,则表单将显示两个日期选择器。如果另一方面选择了上周,则不显示任何内容,因为一旦我单击搜索按钮,搜索就可以直接调用我的SetActionLogsForLastWeek()方法。
如果用户从初始列表中选择Gateway,则构建另一个组合框,其中包含基于网关的选项列表。
我正在寻找一个教程或上一篇文章,指出我在实现我的目标,即根据其他元素的选择构建WPF元素的正确方向。
谢谢
答案 0 :(得分:0)
这是一个相当广泛的问题,因此没有明确的答案。我将描述如何处理这个问题。请记住,这可能不是最好的解决方案。
为了呈现依赖于第一个组合框的控件,请使用数据模板和不同的视图模型。在主视图的资源部分或外部资源(如果已定义),请编写如下内容:
<DataTemplate DataType="{x:Type vm:YourViewModel}"> <vw:YourView /> </DataTemplate>
您必须导入包含视图模型和视图的命名空间(vm:和vw:here)。使用内容控件,您可以根据视图模型呈现视图:
<ContentControl Content="{Binding CurrentViewModel}"></ContentControl>
在您的代码中,您必须拥有一个可以绑定的ViewModel。根据第一个组合框的选择,您现在可以在后面的代码中换出ViewModel,以呈现相关的组合框 - 或者根本没有!
为了说明,让我提供一些示例代码。让我们从主视图模型开始。那个包含第一个组合框绑定的集合的那个(例如字符串“Date of Message”,“Gateway”......)
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>
如果ViewModel(主视图中的ContentControl绑定)等于GateWayControlViewModel,则会呈现GateWayView。最后,您的GatewayView可能如下所示:
<ComboBox ItemsSource="{Binding Gateways}"
SelectedValue="{Binding SelectedGateway}" />
显然,您必须确保您的GatewayControlViewModel实际包含视图中提到的项和属性。它还需要从BaseViewModel派生。
我希望这会给你一些想法。另外,您可能会发现this link很有用(因为它包含一些有关如何处理MVVM的非常有用的提示)。
答案 1 :(得分:0)
如果您想在集合中实现搜索,例如在Combobox或Grid中,您应该阅读一些关于ICollectionView的内容。 ICollectionView允许您根据搜索条件过滤收集。在您的示例中,您还可以通过在viewmodel处理选择更改事件来创建此方法,并创建方法以根据所选输入更新数据。