Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加/删除示例的MVVM设计_C#_Wpf_Mvvm - Fatal编程技术网

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

C# 添加/删除示例的MVVM设计,c#,wpf,mvvm,C#,Wpf,Mvvm,我在MVVM模式中遇到的一件事是当我尝试实现额外的窗口时。当我创建一个额外的窗口和ViewModel来配合该窗口,该窗口将用于特定用途时,我的设计似乎丢失了 举个例子,我有一个非常简单的应用程序。这是我可以添加/删除/恢复的人员列表。我最初的设计是处理ViewModel中的删除/恢复,但添加时必须向用户请求信息。鉴于此,我创建了一个新的窗口和视图模型(AddWindow/AddViewModel)。这时我迷路了。我读过关于创建控制器以在它们之间进行通信的文章,但我甚至不确定这是否有意义 在Add

我在MVVM模式中遇到的一件事是当我尝试实现额外的窗口时。当我创建一个额外的窗口和ViewModel来配合该窗口,该窗口将用于特定用途时,我的设计似乎丢失了

举个例子,我有一个非常简单的应用程序。这是我可以添加/删除/恢复的人员列表。我最初的设计是处理ViewModel中的删除/恢复,但添加时必须向用户请求信息。鉴于此,我创建了一个新的窗口和视图模型(AddWindow/AddViewModel)。这时我迷路了。我读过关于创建控制器以在它们之间进行通信的文章,但我甚至不确定这是否有意义

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

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

我怎样才能更好地思考这个问题?我在这里能做些什么 解决这么简单的问题

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

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

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


现在可以创建更多类并使用Prism之类的框架,但您的类似乎不是一个好的候选者。

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

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

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

/// <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");
    }
}
//
///主窗口的ViewModel
/// 
类MainViewModel
{
公共应用程序模型{get;set;}
公共主视图模型()
{
Model=新的应用程序Model();
Model.ListOfThingsToDo.Add(“清理场地”);
Model.ListOfThingsToDo.Add(“遛狗”);
}
//当您想打开另一个窗口时将调用的某个方法
public void OpenTheWindow()
{
var modalViewModel=新的NewTaskViewModel(模型);
//创建新窗口的实例并显示它。
var win=新的NewTaskWindow(modalViewModel);
win.ShowDialog();
}
}
/// 
///模型来保存数据
/// 
类应用程序模型
{
公共ObservableCollection ListOfThingsToDo{get;set;}
公共应用程序模型()
{
ListOfThingsToDo=新的ObservableCollection();
}
}
/// 
///用于处理添加新任务的ViewModel
/// 
类NewTaskViewModel
{
公共应用程序模型{get;set;}
公共NewTaskViewModel(应用程序模型)
{
模型=模型;
}
//在此处添加将被调用以将任务添加到Model.ListOfThingsToDo的方法
公共void AddTask()
{
Model.ListOfThingsToDo.Add(“要执行的新任务”);
}
}

我想我喜欢这个解决方案,但我必须先实现它,看看它们是如何结合在一起的。通过这样做,我的视图模型/视图是否仍然被认为是解耦的,并且遵循MVVM模式?您的视图仍将仅绑定到其中一个视图模型,它们恰好共享同一个模型。MVVM中的第一个M代表模型,我认为这意味着模型可以共享。感谢您的回复。我想我可能用了一个过于简单的例子来说明我实际上在做什么。在我的应用程序中,我的ViewModel变得太大了,所以我想开始打破它,但我在问题中没有具体说明。然而,我确实喜欢保持简单的想法!