c# - 添加/删除示例的 MVVM 设计

标签 c# wpf mvvm

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

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

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

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

最佳答案

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

<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");
    }
}

关于c# - 添加/删除示例的 MVVM 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344466/

相关文章:

c# - 同步从 Unet/Unity 5 中的另一个可交互对象更改的非玩家对象转换?

c# - 将缩放值绑定(bind)到控件的大小

wpf - 单击按钮时验证 ViewModel

c# - 根据 ViewModel 属性更改画笔

c# - 使用 TargetFramework 创建 Razor 类库到 .net core 3 会引发错误

c# - MV4 路由 来自 MySQL 数据库的动态路由

C# 正则表达式优化

wpf - 将列表框项索引作为参数传递给 objectdataprovider

c# - WPF 工具包 DataGrid 列调整大小事件

wpf - 模型、 View 、 View 模型和演示者