【发布时间】:2018-02-23 22:11:52
【问题描述】:
所以我有一个类MainViewModel,其中有一个按钮。该按钮导航到具有自己的视图模型的视图,让我们调用ListViewModel。它位于 MainViewModel 中。它有一个名为WorkOrders 的ObservableCollection。
在我的主视图模型中,我的 ListViewModel 的列表中有一个属性,它返回项目数。但是,如果我将按钮文本绑定到此属性 (NumberOfWorkOrders),那么当 WorkOrders.Count() 更改时,什么也不会发生。即使我打电话给OnPropertyChanged("NumberOfWorkOrders")。
但是,如果我绑定到 ListViewModel 中的相同属性,它确实有效。 MainViewModel中的属性怎么不起作用?是不是因为来自 INotifyPropertyChanged 的通知在不同的视图模型中不起作用?
不起作用的按钮绑定(使用 MainViewModel 的属性)
<Button
Content="{Binding NumberOfWorkOrders}"
ContentStringFormat="WorkOrders ({0})" />
可以工作的按钮绑定(使用来自 ListViewModel 的属性)
<Button
DataContext="{Binding LVM}"
Content="{Binding NumberOfWorkOrders}"
ContentStringFormat="WorkOrders ({0})" />
MainViewModel.cs
public class MainViewModel : BindableBase
{
// INotifyPropertiesChanged is implemented in BindableBase
private ListViewModel listViewModel = new ListViewModel();
// This is where I would like to bind my button text to
public int NumberOfWorkOrders
{
get { return listViewModel.WorkOrders.Count(); }
}
// I would prefer not to have this
public ListViewModel LVM
{
get { return listViewModel; }
}
}
ListViewModel.cs
public class ListViewModel : BindableBase
{
// INotifyPropertiesChanged is implemented in BindableBase
public ObservableCollection<WorkOrder> WorkOrders
{
get; set;
}
// I would prefer to use the version of this in the MainViewModel
public int NumberOfWorkOrders
{
get { return listViewModel.WorkOrders.Count(); }
}
public void RefreshWorkOrders()
{
(...) // Load work orders and add them to collection
OnPropertyChanged("NumberOfWorkOrders");
}
}
【问题讨论】:
-
见Here你需要实现
INotifyPropertyChanged -
@Decoder94 我已经在我的
BindableBase类中实现了INotifyPropertyChanged,它被两个视图模型继承。我还应该在哪里实现它? -
它是绑定的来源,即 NumberOfWorkOrders 属性定义的类,需要引发 PropertyChanged 事件。