【问题标题】:Change ViewModel property using button使用按钮更改 ViewModel 属性
【发布时间】:2014-12-10 11:22:48
【问题描述】:

我正在学习 WPF 和 MVVM,到目前为止我很喜欢使用它。我想要一种没有代码隐藏的纯粹主义风格。

我的软件很简单:我有一堆代表联系人的 POCO 对象。该视图的左侧有一个包含所有联系人的列表框。通过在列表框中选择联系人,您可以在右侧看到详细信息,例如姓名。这完美地工作,列表框绑定到具有联系人列表的视图模型,并且视图模型还有一个名为 CurrentContact 的属性,详细信息视图中的字段绑定到该属性。 (Listbox 的 SelectedItem 绑定到 CurrentContect 属性,因此当您在列表中选择联系人时它会自动更改。

问题是:我想要一种添加新联系人的好方法,最好将“CurrentContact”设置为 null,这会导致详细信息中的字段为空,然后我可以填写并按保存。我的第一个选择是在列表框的底部添加一个“新”项目,但事实证明这很难做到,因为列表框绑定到列表中没有这样一个空对象的视图模型。相反,我在列表底部添加了一个按钮,将 CurrentContact 设置为 null。我需要这个按钮来更改我的视图模型上的属性,但我想不出在这里使用绑定的方法。我在我的视图模型中实现了一个命令,它将属性设置为空。这可行,但似乎是一种荒谬的解决方法,对于如此简单的事情来说,这是大量的样板代码。这真的是唯一干净的方法吗?

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    不幸的是,你做得很好。样板代码应该在那里。

    您想使用 ICommand 将填充的对象添加到您的列表中。

    public void InitializeCommands(){
        AddEContactCommand = new ICommandImpl(AddElement); //you'll have to derive an implementation for ICommand for this
    }
    
    public ICommand AddContactCommand
    {
        get { return _addContactCommand; }
        set { SetValue(ref _addContactCommand, value); } //setvalue is wrapper for notifychanged from viewmodelbase abstract class
    }
    public void AddContact() {
         //do add contact
         //set properties null
    }
    

    【讨论】:

    • 我最终需要实现 ICommand 来执行真正的纯 MVVM,这是我已经接受的,例如实际的 Save 功能。但是,当我想要做的只是改变 ViewModel 的一个属性时,我无法想象没有更好的方法。我的意思是,列表框已经使用绑定更改了相同的属性,那么为什么我不能使用按钮做类似的事情呢?
    • MVVM 的目的不是让事情变得优雅,而是将表示层与与之交互的逻辑分开。在这种情况下,您试图将视图模型逻辑强制到视图中,而 MVVM 正在尝试(并成功)挫败您的尝试:)。
    • 我不同意。当然,由 ViewModel 负责保存新联系人,但必须由 View 来处理来自用户的交互。我不是试图将 ViewModel 逻辑强制到视图中,而是试图将用户的交互传递给 ViewModel。
    • 当你说“我需要这个按钮来更改我的视图模型上的属性,但我想不出在这里使用绑定的方法。”如果您可以使用 ON THE VIEW 绑定来更改您的视图模型,那么您将在您的视图中执行逻辑,这正是 MVVM 不希望您做的事情。相反,视图连接到 viewmodel 上的命令,而 viewmodel 上的命令会更改属性。
    • 那为什么 MVVM 在 ListBox SelectedItem 绑定到我的 ViewModel 上的 CurrentContact 属性时没有任何问题?这是完全相同的交互方式。列表框列出了 ObservableCollection 中的所有联系人,当您选择其中一个时,ViewModel 的 CurrentContact 立即被绑定更改。基本上我想要的只是清除列表框中的选择(不使用代码隐藏)更高级。
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多