WPF MVVM ListView不更新!
我使用Prism v4和MVVM。 在我的ViewModel我有:WPF MVVM ListView不更新!
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(我试着用一个ListView过,不工作!):
<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 ... 但在调试中,I ist is fullfiled .... 我应该怎么做才能更新UI?
TB_ADDRESS
的RL_ADDRESS_PHONE
财产也必须实施INotifyPropertyChanged
以及。如果它是List
,则应该使用ObservableCollection
,它实现INotifyCollectionChanged
,这对于您尝试实现的行为是必需的。
另外,作为一条建议 - 查看C#语言的设计准则和命名约定,可以在msdn中找到它(尽管它说.net 1.1,它仍然适用于以下任何版本的框架)。
你的绑定工作吗?你有没有检查输出窗口?绑定路径上的所有属性都是公开的吗?需要更多的代码。
所有的财产通知放在一边:如果您的绑定找到ObservableCollection
那么将更新,如果您添加对象。所以我认为你可能会在路径上的某处使用字段或非公共属性。
如果不是这种情况,请确保您不会覆盖对ObservableCollection
的引用,除非您有正确的PropertyChanged
通知。 (您应该在绑定路径的每个类中实现该接口(INotifyPropertyChanged
),因为每个被覆盖的引用不会通知该视图将会破坏您的更新)。
您提到了使用WCF服务。是否有可能您的可观察集合是在与UI线程不同的线程上创建的。如果是这种情况,你的UI将无法绑定到它。 Bea Stollnitz在她的博客中讨论了跨线程绑定的问题 - >http://bea.stollnitz.com/blog/?p=34。
你应该能够通过在UI线程上创建observable集合来获得它。
神圣的废话...我希望你没有控制OVER_YOUR_MODEL_CLASS_AND_PROPERTY_NAMES。无论如何,用框架指南的副本将其击中。 – Will 2011-02-09 12:27:47
我不明白吗?你什么意思? – renanlf 2011-02-09 13:19:25
@Renalf:我们需要查看RL_ADDRESS_PHONE属性的定义以及RaisePropertyChanged方法的内容。另外,意思是ALL_CAPS_PROPERTIES通常被认为是使代码不易读。有一个由微软发布的框架开发指南文档,其中有最佳实践,并且这是所提及的。 – 2011-02-09 15:07:56