使用MvvM和WPF创建动态搜索

时间:2014-12-29 10:30:55

标签: wpf mvvm

我是mvvm和WPF的新手,所以我正在寻找一些指导来实现以下目标。

我想在我的应用中创建一个搜索部分,根据用户选择的条件构建搜索选项。

例如,搜索的第一个组合框提供了最高级别的选择:

消息日期

网关

方向

等。 ......

第二部分是我的操作员

因此,例如,如果选择了“消息日期”,则会向用户提供另一个选项组合框

介于

之间

上周

上个月

Etc ..

搜索的最后一部分基于上面的运算符,因此如果选择了Is Between,则表单将显示两个日期选择器。如果另一方面选择了上周,则不显示任何内容,因为一旦我单击搜索按钮,搜索就可以直接调用我的SetActionLogsForLastWeek()方法。

如果用户从初始列表中选择Gateway,则构建另一个组合框,其中包含基于网关的选项列表。

我正在寻找一个教程或上一篇文章,指出我在实现我的目标,即根据其他元素的选择构建WPF元素的正确方向。

谢谢

2 个答案:

答案 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处理选择更改事件来创建此方法,并创建方法以根据所选输入更新数据。