【问题标题】:Binding properties between viewmodels视图模型之间的绑定属性
【发布时间】:2020-07-01 14:49:55
【问题描述】:

假设我有两个视图:FileListEditor。 他们都有自己的视图模型,使用DependencyProperty 绑定。 视图模型看起来有点像这样:

public class FileVM : INotifyPropertyChanged
{
    public string FileName { get; set; }
}

public class FileListVM : INotifyPropertyChanged
{
    public ObservableCollection<FileVM> Files { get; set; }
    public FileVM SelectedFile { get; set; }
}

public public class EditorVM : INotifyPropertyChanged
{
    string FileName { get; set; }
}

想象一下他们正确地实现了INotifyPropertyChanged

现在我不想让FileListVMEditorVM 互相了解。它们也可以很容易地独立存在。但在一个用例中,我想将FileListVM.SelectedFile.FileName 绑定到EditorVM.FileName。每当所选文件或文件名更改时,编辑器中的文件名也应更改。每当编辑器更改编辑器中的文件名时,所选文件的名称也应更改。

现在我的问题是:我怎样才能干净地做到这一点?我猜该解决方案存在于它们的父视图模型中(例如MainVM),因为该视图模型知道两个子视图模型之间的连接。但是我不确定是否可以通过 xaml 将两者连接起来,并且我想尽可能避免编写属性更改事件处理程序。

【问题讨论】:

  • 处理程序优于父虚拟机。因为带有handler的解决方案具有高灵活性和弱耦合。
  • 那么如何将 FileVM 添加到编辑器(不仅仅是文件名)并将所选实例传递给它?
  • 在xaml中如何布局以及如何使用两个视图:FileList和Editor?可以给我们看一下相关代码sn-p吗?

标签: c# xaml mvvm uwp viewmodel


【解决方案1】:

请看: Communicate between View Models in MVVM

我建议使用像 Galasoft 这样的 MVVM 框架,因为它们具有有用的功能并且通常使用 MVVM 更容易;)

如果您不喜欢使用它们,您可以在一个 VM 中添加事件 SelectedFileChanged 并从另一个 VM 订阅它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2010-12-02
    • 2011-05-22
    • 2020-07-20
    • 2013-03-22
    • 2023-03-20
    相关资源
    最近更新 更多