【问题标题】:Creating a dynamic seach using MvvM and WPF使用 MvvM 和 WPF 创建动态搜索
【发布时间】:2014-12-29 10:30:54
【问题描述】:

我对 mvvm 和 WPF 还很陌生,所以我正在寻找一些指针来实现以下目标。

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

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

消息日期

网关

方向

等等。 ......

第二部分是我的运营商

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

介于

上周

上个月

等等。

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

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

我正在寻找一个教程或以前的帖子,它为我指明了正确的方向,以实现我的目标,即根据其他元素的选择来构建 WPF 元素。

谢谢

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    这是一个相当广泛的问题,因此没有明确的答案。我将描述我将如何处理这个问题。请记住,这可能不是最好的解决方案。

    为了呈现依赖于第一个组合框的控件,请使用数据模板和不同的视图模型。在你的主视图的资源部分,或者如果你定义了一个外部资源,写如下内容:

    <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 的非常有用的提示)。

    【讨论】:

      【解决方案2】:

      如果你想在集合中实现搜索,例如在组合框或网格中,你应该阅读一些关于 ICollectionView 的内容。 ICollectionView 将允许您根据搜索条件过滤集合。在您的示例中,您还可以通过处理视图模型中的选择更改事件并创建方法来根据所选输入更新数据来做到这一点。

      【讨论】:

        猜你喜欢
        • 2017-09-18
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2021-10-06
        • 2013-06-07
        • 2014-10-04
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多