如何从另一个视图模型实例化和显示ViewModel

时间:2011-08-06 02:49:34

标签: c# .net wpf data-binding mvvm

我是MVVM的新手,我跟着josh smith article,我正在努力开发我的第一次尝试。在我的情况下,我有一个主视窗模型:

var vm = new MainVM();
MainWindow window = new MainWindow();
window.DataContext = vm;

我在主窗口ItemSuppliersViewModel中使用SuppliersViewModel将两个视图模型ItemSuppliersSuppliersView绑定到两个视图datatemplateresourcedictionary,如下所示:

<DataTemplate DataType="{x:Type VM:ItemSuppliersViewModel}">
    <VV:ItemSuppliersView/>
</DataTemplate>
<DataTemplate DataType="{x:Type VM:SuppliersViewModel}">
    <VV:SuppliersView/>
</DataTemplate>

在主窗口中,我有一个列表框,显示Binded to:

的项目列表
<ListBox x:Name="ItemsListBox" ItemsSource="{Binding AllItems}" SelectedItem="{Binding     SelectedItem}" DisplayMemberPath="Item_Name" />

AllItems是主视图模型公开的公共属性:

public IList<Item> AllItems { get { return (IList<Item>)_itemsRepository.FindAll(DetachedCriteria.For<Item>()); } }

当用户从列表框中选择一个项目时,显示与此项目相关的一些数据的列表,由ItemSuppliers视图模型和ItemSuppliersView表示,并使用{{1}显示在网格中}:

itemscontrol

<Grid Margin="246,132,93,94"> <ItemsControl ItemsSource="{Binding ItemSuppliersVM}" Margin="4"/> </Grid> 在主视图模型中公开如下:

ItemSuppliersVM

以下是绑定到列表框所选项目的selecteditem属性:

ItemSuppliersViewModel itemSuppliersVM;
public ItemSuppliersViewModel ItemSuppliersVM
    {
        get
        {
            return _itemSuppliersVM;
        }
        set
        {
            _itemSuppliersVM = value;
            OnPropertyChanged("ItemSuppliersVM");
        }
    }

创建项目供应商视图模型的 public Item SelectedItem { get { return _selectedItem; } set { _selectedItem = value; OnPropertyChanged("SelectedItem"); ShowItemSuppliers(); } }

showItemSuppliers

问题是当在列表框中选择任何项目时没有发生任何事情,但是void ShowItemSuppliers() { _itemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30)); } 已经过测试并且工作正常,当我在断点处所有绑定都正常工作并且它遍历{{1}时}属性,然后是itemsrepository方法。

我认为问题出在这个方法中,所以有什么问题,这个方法是在主窗口视图模型中实例化selecteditem的正确方法吗?

1 个答案:

答案 0 :(得分:3)

您正在直接设置字段,并且不会引发PropertyChanged事件。如果不引发该事件,绑定引擎将不知道您的属性已更改。如果你改变了

_itemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30));

ItemSuppliersVM = new ItemSuppliersViewModel(_itemsRepository, _selectedItem, new DateTime(2011, 03, 01), new DateTime(2011, 03, 30));

你的装订应该有效。