WPF MVVM ListView不更新!

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?

+10

神圣的废话...我希望你没有控制OVER_YOUR_MODEL_CLASS_AND_PROPERTY_NAMES。无论如何,用框架指南的副本将其击中。 – Will 2011-02-09 12:27:47

+0

我不明白吗?你什么意思? – renanlf 2011-02-09 13:19:25

+2

@Renalf:我们需要查看RL_ADDRESS_PHONE属性的定义以及RaisePropertyChanged方法的内容。另外,意思是ALL_CAPS_PROPERTIES通常被认为是使代码不易读。有一个由微软发布的框架开发指南文档,其中有最佳实践,并且这是所提及的。 – 2011-02-09 15:07:56

TB_ADDRESSRL_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集合来获得它。