WPF MVVM多视图问题,使用ListBox.SelectedItem

时间:2012-07-03 18:47:52

标签: c# wpf wcf mvvm viewmodel

我一直在处理简单的MVVM模式,并且已经更多地深入研究了WPF中数据绑定的全部功能。我遇到了一个问题,我似乎无法解决这个问题。对于初学者,请使用以下MainWindowViewModel代码:

ObservableCollection<DataRecord> _SomeData = new ObservableCollection<DataRecord>();
public ObservableCollection<DataRecord> SomeData
{
    get
    {
        return _SomeData;
    }
    set
    {
        _SomeData = value;
    }
}

public MainWindowViewModel()
{
    CurrentViewModel.Add(new RandomViewModel(SomeData));
}

我没有粘贴全部代码,而是将ListBox绑定到ObservableCollection&lt;&gt; ViewModelBase,引用添加的每个基础的Image属性(图像导航)。现在!对于这个问题:

我正在使用DataTemplate从ViewModel引用View,使用从ListBox.SelectedItem返回的字符串。因为RandomViewModel需要传递参数,所以每当我单击ListBox.SelectedItem时,都会实例化一个新的View而不是ListBox中创建的View。发生这种情况的原因很简单,新的View需要一个RandomViewModel来引用数据绑定。所以!使用臭名昭着的ListBox.SelectedItem用于ViewModel / View Navigation,我应该如何创建View,并仍然引用其ViewModel,即使ViewModel需要传递参数?要么!我应该如何使用已经实例化的ViewModel并将其用作新创建的View的引用?

1 个答案:

答案 0 :(得分:1)

我不明白为什么每个人都先用视图做MVVM。我首先使用视图只是为root / mainwindow,也许是一个登录对话框。对于应用程序的其余部分,我根本不关心view / xaml并采用 Viewmodel第一个方法。使用mvvm这样容易得多。在您的情况下,您的mainviewmodel像您一样处理randomviewmodel的列表。但现在不必创建随机视图并分配randomviewmodel,只需将seleced randomviewmodel绑定到contentpresenter即可。 wpf会查看你的资源,找到一个数据模板“我应该如何渲染这个randomviewmodel”,你会看到你想要的视图。每当创建一个新的视图实例时,你都会看到,但总是采用相同的视图模型。

那就是mvvm对我来说:不关心你的观点只是处理你的视图模型。