我是MVVM的新手,我跟着josh smith article,我正在努力开发我的第一次尝试。在我的情况下,我有一个主视窗模型:
var vm = new MainVM();
MainWindow window = new MainWindow();
window.DataContext = vm;
我在主窗口ItemSuppliersViewModel
中使用SuppliersViewModel
将两个视图模型ItemSuppliers
,SuppliersView
绑定到两个视图datatemplate
,resourcedictionary
,如下所示:
<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
的正确方法吗?
答案 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));
你的装订应该有效。