【问题标题】:WPF MVVM ViewModel containing ViewModels not updating包含未更新的 ViewModel 的 WPF MVVM ViewModel
【发布时间】:2016-10-21 00:25:38
【问题描述】:

我对 WPF 和 MVVM 非常陌生,这让我很头疼。由于导航问题,我决定一次显示所有内容。我想我会创建一个新的 ViewModel (MainViewModel) 来包含我的另外两个 ViewModel(StudentViewModelAddStudentsViewModel)。

MainViewModel 包含类似这样的内容:

private StudentViewModel _studentVM;
private AddStudentsViewModel _addStudentsVM;

public StudentViewModel StudentVM
{
    get { return _studentVM; }
    set
    {
        if (_studentVM != value)
        {
            _studentVM = value;
            NotifyPropertyChanged("StudentVM");
        }
    }
}

(public AddStudentsViewModel AddStudentsVM 也存在,我只是想保持简短)

我已成功将StudentVMAddStudentsVM 绑定到我的主视图,因为我可以在初始化阶段以编程方式设置值,并且在调试时,我可以看到我的按钮点击被重定向到正确的方法。甚至看起来我已经成功地将学生添加到对象中,但是我的主视图并没有反映这些变化。

我在MainViewModel 中遗漏了什么吗?还是 ViewModel 无法看到其中任何其他 ViewModel 的变化?

【问题讨论】:

  • 如果你添加绑定所在的视图代码部分,你的帖子仍然会很短。
  • 您需要在您的子视图模型上公开一个方法,该方法允许您在这些模型上提出NotifyPropertyChanged()。然后在方法中,您可以只使用一个空字符串作为属性名称,这会导致从该视图模型刷新视图中的所有绑定。
  • 您需要在问题中添加更多信息。您在哪个属性上调用 setter?视图如何引用数据上下文? xaml 中的绑定是什么样的?你期待什么,你实际得到什么?提供这些信息,您可能会得到更具体的答案。

标签: wpf mvvm view-model-pattern


【解决方案1】:

如果您的视图通过嵌套导航到StudentVM 属性StudentVM.Property 绑定到StudentViewModel 内的某个属性,那么要将StudentVM.Property 上的更改反映到您的视图将需要您通知视图@987654325 @(不是StudentVM.Property)已更改。

因此,这取决于您如何定义绑定以及您要引发 PropertyChanged 事件的属性。

【讨论】:

    【解决方案2】:

    包含两个其他视图模型的视图模型。想一想。这不是一个好主意。

    无论如何,您也必须在包含的视图模型中实现INotifyPropertyChanged。不仅在包含 MainViewModel 中。

    也许是这个问题?

    【讨论】:

    • 将应用程序的功能模块化到小类中并将这些类组合在一起的做法有什么问题?这就是 OOP 的目的。
    • 如果您将其声明为“不是一个好主意”,请至少告诉我们原因。老实说,我不知道这有什么问题。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多