WPF MVVM ListView不更新!

时间:2011-02-09 12:23:26

标签: wpf listview mvvm datagrid prism

我正在使用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中,列表已满了.... 我该怎么做才能更新用户界面?

3 个答案:

答案 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集合的创建来绕过它。