【问题标题】:Bind different Properties from a ViewModel depending using triggers根据使用触发器从 ViewModel 绑定不同的属性
【发布时间】:2011-11-10 09:27:00
【问题描述】:

我正在尝试实现一个简单的事情,或者我认为它很简单但我不知道是否可能......

想象以下场景...在 ViewModel 中,我有一个名为 SelectedProduct 的属性和另一个名为 NewProduct 的属性(两者的类型相同,即模型)。

在我的 MainWindow 中,我们有一个 ListView 和两个按钮,一个是 Add 按钮,另一个是 Update 按钮(这一个将更新 ListView 中的 Selected Item),两者都将打开同一个窗口,但会不同的东西。

我在按钮中使用命令,所以我认为如果单击主窗口的添加按钮或使用另一个命令,我可以使用一个命令。

所以如果我们点击 Add 按钮,第二个窗口中的控件(TextBoxes 和 ComboBoxes)将绑定 NewProduct 属性,如果我们点击 Update 按钮,第二个窗口将绑定 SelectedProduct 属性。

有什么办法可以做到吗?

提前致谢

【问题讨论】:

    标签: wpf data-binding binding mvvm wpf-controls


    【解决方案1】:

    我可以看到两种适用于这种情况的方法是使用两个不同的命令,正如你所说的那样,每个命令都会以不同的方式调用 Window

    第一个选项是为Window创建两个构造函数(一个用于添加,另一个用于更新),或者只创建一个通过以枚举值作为其参数。

    public void Window2(DisplayMode mode)

    其中DisplayMode 是具有两个值的enumAddUpdate

    public void Window2() // The default 'Add' window
    {
    }
    
    public void Window2(ModelObject instance) // The 'Update' window
    {
    }
    

    第二个选项Window 的构造函数设为私有,并在类上创建静态方法以创建窗口实例并将其显示给用户。

    这可以像这样使用

    Window2.UpdateItem(selectedItem)

    通过这些方法中的每一个,将窗口实例的 DataContext 设置为您想要编辑的对象(设置为对象的新实例,或者设置为传递给构造函数的实例)

    【讨论】:

      【解决方案2】:

      您为什么不只创建一个 EditedProduct 属性并为其赋予适当的值?

      【讨论】:

        【解决方案3】:

        看看下面的视图模型。

        您可以创建一个将绑定到您的视图的新属性,并且您可以根据您的按钮命令更改属性引用。

        在下面的代码中,我创建了一个已编辑的属性(绑定到视图),并在添加按钮命令执行时将 Newproduct 分配给它,并在更新时分配 SelectedProduct..

         class Viewmodel : ViewModelBase
            {
        
                private void AddCommandExecute(object o)
                {
                    // your logic
                    EditedProduct = NewProduct;
                }
        
                private void UpdateCommandExecute(object o)
                {
                    // your logic
                    EditedProduct = SelectedProduct;
                }
        
        
                private Product _selectedProduct;
        
                public Product SelectedProduct
                {
                    get { return _selectedProduct; }
                    set
                    {
                        _selectedProduct = value;
                        OnPropertyChanged("SelectedProduct");
                    }
                }
        
                private Product _newProduct;
        
                public Product NewProduct
                {
                    get { return _newProduct; }
                    set
                    {
                        _newProduct = value;
                        OnPropertyChanged("NewProduct");
                    }
                }
        
                private Product _editedProduct;
        
                public Product EditedProduct
                {
                    get { return _editedProduct; }
                    set
                    {
                        _editedProduct = value;
                        OnPropertyChanged("EditedProduct");
                    }
                }
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-04
          • 1970-01-01
          • 2016-06-12
          • 2019-03-14
          • 2020-08-11
          • 1970-01-01
          • 2010-12-20
          • 1970-01-01
          相关资源
          最近更新 更多