1

我在 MVVM 模式上遇到的一件事是当我尝试实现额外的 Windows 时。当我创建一个额外的 Window 和 ViewModel 以配合那个将服务于特定目的的 Window 时,我的设计似乎迷失了。

以我有一个非常简单的应用程序为例。这是我可以添加/删除/恢复的人员列表。我的初始设计是从 ViewModel 处理删除/恢复,但添加时我必须向用户请求信息。鉴于此,我创建了一个新的 Window 和 ViewModel (AddWindow/AddViewModel)。在这一点上,我迷路了。我已经阅读了有关创建控制器以在它们之间进行通信的信息,但我什至不确定这是否有意义。

在 AddWindow 上,用户可以填写两个字段(名字/姓氏),然后单击添加(或取消),在这种情况下,需要将数据传递回 ViewModel,以便可以将其添加到集合中它已更新(AddWindow 也必须关闭)。

我怎样才能以更好的方式思考这个问题,我可以在这里做些什么来解决这样一个简单的问题?

4

2 回答 2

1

我怎样才能以更好的方式思考这个问题,我可以在这里做些什么来解决这样一个简单的问题?

尽量保持简单。不要不必要地添加视图/视图模型组合。在您的情况下,如果可能,请将 Add 功能放在现有视图中。也许您可以将您的视图/视图模型重命名为更通用的名称,例如“ManageThisView”/“ManageThisViewModel”?现在你有一个堆栈来管理一组相关的功能。

通过切换控件的可见性或使用节省空间的控件,尝试在您的视图上发挥创意。只要视图是直观的,用户可能更喜欢它而不是需要大量表单导航的方案。

我并不是建议您创建包含太多内容的“超级”视图/视图模型,而是考虑对相关功能进行分组并简化您拥有的类的数量。

有时间创建更多类并使用 Prism 等框架,但您的似乎不是一个好的候选者。

于 2013-01-15T18:55:27.967 回答
1

创建一个新类 ApplicationModel 来保存所有用户数据。您的“主”视图模型应该创建它,然后将它保存在一个属性中。您的视图需要绑定到模型中数据的完整路径:

<DataGrid ItemsSource="{Binding Path=Model.ListOfThingsToDo, Mode=OneWay}" ... />

在新 ViewModel 的构造函数中,您将该模型作为参数提供。这样,您的所有 ViewModel 将共享相同的模型,并且新的 ViewModel 可以修改/查看与您的“主” ViewModel 相同的数据。

/// <summary>
/// ViewModel for the Main Window
/// </summary>
class MainViewModel
{
    public ApplicationModel Model { get; set; }

    public MainViewModel()
    {
        Model = new ApplicationModel();
        Model.ListOfThingsToDo.Add("Clean the yard");
        Model.ListOfThingsToDo.Add("Walk dog");
    }

    // Some method that will be called when you want to open another window
    public void OpenTheWindow()
    {
        var modalViewModel = new NewTaskViewModel(Model);
        // Create an instance of your new Window and show it. 
        var win = new NewTaskWindow(modalViewModel);
        win.ShowDialog();
    }
}

/// <summary>
/// Model to hold the data
/// </summary>
class ApplicationModel
{
    public ObservableCollection<string> ListOfThingsToDo { get; set; }
    public ApplicationModel()
    {
        ListOfThingsToDo = new ObservableCollection<string>();
    }
}


/// <summary>
/// ViewModel to handle adding new things to do
/// </summary>
class NewTaskViewModel
{
    public ApplicationModel Model { get; set; }

    public NewTaskViewModel(ApplicationModel model)
    {
        Model = model;
    }

    // Add methods here that will be called to add tasks to the Model.ListOfThingsToDo
    public void AddTask()
    {
        Model.ListOfThingsToDo.Add("the new task to do");
    }
}
于 2013-01-15T18:56:27.750 回答