我在 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/