根据使用触发器,从ViewModel绑定不同的属性

时间:2011-09-05 06:23:15

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

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

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

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

我在按钮中使用命令,所以我想如果单击MainWindow的Add按钮或使用其他Command,我可以使用一个Command。

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

有没有办法实现这个目标?

提前致谢

3 个答案:

答案 0 :(得分:2)

为什么不创建一个EditedProduct属性并给出相应的值?

答案 1 :(得分:0)

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

第一个选项是为Window 创建两个构造函数(一个用于Add,另一个用于Update),或者只创建一个传入枚举值作为参数。

public void Window2(DisplayMode mode)

其中DisplayModeenum,其中包含两个值(AddUpdate

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

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

第二个选项是使Window私有的构造函数,并在类上创建静态方法来创建Window的实例并将其显示给用户。 / p>

这可以像

一样使用

Window2.UpdateItem(selectedItem)

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

答案 2 :(得分:0)

查看以下视图模型。

您可以创建一个新属性,该属性将绑定到您的视图,您可以根据按钮命令更改属性参考。

在下面的代码中,我创建了一个已编辑的属性(Binded to view),我已经在添加按钮命令执行时为其分配了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");
            }
        }

    }