我正在使用Prism v4和MVVM。 在我的viewmodel中我有:
private TB_COMPANY tb;
public TB_COMPANY Tb {
get {
return this.tb;
}
private set {
if ( this.tb != value ) {
this.tb = value;
this.RaisePropertyChanged(() => this.Tb);
}
}
}
在我的页面中,我有一个数据网格(我也尝试使用列表视图,不起作用!):
<DataGrid ItemsSource="{Binding Tb.TB_ADDRESS.RL_ADDRESS_PHONE}" .../>
RL_ADDRESS_PHONE是该公司的电话列表...... 所以,在某些时刻我将手机添加到列表中:
private void MyCommand()
{
...
Tb.TB_ADDRESS.RL_ADDRESS_PHONE.Add(
new RL_ADDRESS_PHONE
{
TB_PHONE = new TB_PHONE
{
NU_PHONE = _txtTelefone,
ST_TYPE = _txtTipoTelefone
}
});
...
}
但UI没有任何反应...... 但是在Debug中,列表已满了.... 我该怎么做才能更新用户界面?
答案 0 :(得分:4)
RL_ADDRESS_PHONE
的{{1}}属性也必须实现TB_ADDRESS
。如果是INotifyPropertyChanged
,则应使用List
来实现ObservableCollection
,这是您尝试实现的行为所必需的。
另外,作为一条建议 - 看一下C#语言的设计指南和命名约定,你可以在msdn中找到它(虽然它说.net 1.1,它仍然适用于任何以下版本的框架。)
答案 1 :(得分:2)
你的绑定是否有效?你检查过输出窗口了吗?绑定路径上的所有属性都是公开的吗?需要更多代码。
除了所有属性通知:如果您的绑定找到ObservableCollection
,则将更新,如果您添加对象。所以我认为你可能在路径的某个地方使用了一个字段或非公共属性。
如果不是这种情况,请确保不要覆盖对ObservableCollection
的引用,除非您有适当的PropertyChanged
通知。 (您应该在绑定路径上的每个类中实现该接口(INotifyPropertyChanged
),因为未通知视图的每个覆盖引用都将破坏您的更新。)
答案 2 :(得分:0)
您提到过使用WCF服务。是否有可能在与UI线程不同的线程上创建可观察集合。如果是这种情况,UI将无法绑定到它。 Bea Stollnitz在她的博客上讨论了跨线程绑定的问题 - &gt; http://bea.stollnitz.com/blog/?p=34
你应该能够通过在UI线程上调用observable集合的创建来绕过它。