我知道这个问题已经被问了很多次,而且我已经阅读了许多关于它的答案。然而,它们都没有满足我的要求,因此我需要一些建议。
目前我正在开发的应用程序看起来像这样:http://screenshooter.net/100101493/smrkpog
这是一个基于MVVM Light Toolkit的WPF MVVM应用程序。带有网格的区域是一个ListBox
+Canvas
。项目(我们称之为“诺姆”)又由每个ListBox
+Canvas
组成,并由用户动态创建。每个Neume由作为红色形状呈现的“元素”组成。
当用户双击一个Neume时,将打开一个新窗口。它应该能够编辑所选Neume所包含的元素(翻译、调整大小、旋转)。我想做的是将存储在我的MainViewModel中的SelectedNeume(具有元素列表)传递给我的新创建的窗口的ViewModel。 我有一些实现这个目标的想法:
- 完全跳过新的ViewModel并将MainViewModel设置为新窗口的
DataContext
, - 在新的ViewModel中创建一个'MainViewModel'字段,并在打开新窗口时将其传递到那里,
- 使用MVVM Light Toolkit提供的Messaging/Mediator模式。
我正在寻找既简单又整洁的解决方案。我很想利用选项3,但是就WPF而言,我是一个相对较新的人,真的不知道如何开始。此外,我担心的是,在触发主ListBox上的双击事件时打开新窗口可能会有问题,因为我无法找到一种方法将命令绑定到ListBoxItem,无论是在其样式还是DataTemplate中(事件触发器/EventToCommand解决方案对我不起作用)。
这是事件:
private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var item = ((FrameworkElement)e.OriginalSource).DataContext as Neume;
if (item != null)
{
var view2 = new EditWindow();
view2.Owner = this;
view2.SetDataContext();
view2.ShowDialog();
}
}
目前,
SetDataContext()
方法会根据第一种选项绑定 DataContext。public void SetDataContext()
{
if(this.Owner != null)
DataContext = this.Owner.DataContext;
}
我的问题是:你会推荐哪一个选项?1或者2有没有什么问题?可能会有内存泄漏吗?