3

我正在开发一个 WPF 项目,该项目是代码隐藏 xaml/xaml.cs 和一些不太完整的 ViewModel 的混搭。

(免责声明:直到最近,我在 WPF 方面的经验还很少。我可以相当熟练地设计和布局 Window 或 UserControl,而且我认为我掌握了将 MVVM ViewModel 从 View 中分离出来并进行绑定的窍门接线,但这是我目前使用 WPF 的经验的限制。)

我的任务是为程序添加一些新功能,这样看起来就需要先将其转换为正确使用 MVVM。

我将展示我面临的一个具体问题:

有一个名为SettingsWindow.xaml我正在使用的视图。它是一组文本框、标签等等。我已将所有视图数据剥离到一个ViewModel类似于以下内容的类中:

class SettingsViewModel : ViewModelBase {

    private String _outputDirectory;
    public String OutputDirectory {
        get { return _outputDirectory; }
        set { SetValue( () => this.OutputDirectory, ref _outputDirectory, value) ); }
    }

    // `SetValue` calls `PropertyChanged` and does other common-tasks.

    // Repeat for other properties, like "Int32 Timeout" and "Color FontColor"
}

在原始 ViewModel 类中有 2 个方法:ReadFromRegistrySaveToRegistry. 该ReadFromRegistry方法由 ViewModel 的构造函数SaveToRegistry调用,该方法由MainWindow.xaml.cs的代码隐藏调用,如下所示:

private void Settings_Click(Object sender, RoutedEventArgs e) {

    SettingsViewModel model = new SettingsViewModel(); // loads from registry via constructor
    SettingsWindow window = new SettingsWindow();
    window.Owner = this;
    window.DataContext = model;
    if( dialog.ShowDialog() == true ) {

        model.SaveToRegistry();
    }
}

...但这对我来说似乎是错误的。我认为 ViewModel 应该只包含一个用于绑定目的的可观察数据包,它不应该负责自我填充或持久性,这是控制器或其他一些协调器的责任。

我已经读了几天关于 MVVM 的文章,我读过的文章都没有提到控制器或打开子窗口或保存状态的逻辑应该去哪里。我已经看到一些文章确实将该代码放入 ViewModel 中,其他人继续为此使用代码隐藏,其他人抽象出所有内容并使用IService基于 - 的解决方案,这对我来说是 OTT。

鉴于这是一个转换项目,我将随着时间的推移单独转换每个窗口/视图,我无法真正对其进行大修,但我可以从这里去哪里?MVVM 中的控制器到底长什么样?(我为模糊的术语道歉,现在是凌晨 3 点 :))。

我重构的目的是分离关注点;可测试性不是目标,也不会实施。

4

2 回答 2

6

我个人不同意在我的 ViewModels 中添加与 View 相关的东西(毕竟,它是 View 的模型!)

所以我使用了一个控制器范例,当视图告诉视图模型执行某些操作(通常通过命令)并且视图模型使用命令类来执行操作时,例如保存数据、实例化新的视图/视图模型对等。

我实际上也将我的 ViewModel 和 ViewData 分开(ViewModel“包含”ViewData),因此 ViewData 只处理数据,ViewModel 具有一些逻辑和命令处理等。

我在这里写了

于 2013-10-30T04:26:15.607 回答
1

您需要的是 WPF 中的命令。

基本上,您绑定Button.Command到 ViewModel 中的 ICommand 属性,Button单击时您会收到通知,ViewModel而无需使用后面的代码和大小写DataContext或您尝试过的任何黑客攻击。

http://msdn.microsoft.com/en-us/library/ms752308.aspx

于 2013-10-19T10:56:21.497 回答