【问题标题】:WPF MVVM ListView does not update!WPF MVVM ListView 不更新!
【发布时间】:2011-06-24 02:33:06
【问题描述】:

我正在使用 Prism v4 和 MVVM。 在我的视图模型中,我有:

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 没有任何反应... 但在调试中,列表已满...... 我应该怎么做才能更新 UI?

【问题讨论】:

  • 天哪...我希望你无法控制 OVER_YOUR_MODEL_CLASS_AND_PROPERTY_NAMES。无论谁这样做,都给他们一份《框架指南》的副本。
  • 我不明白?什么意思?
  • @Renalf:我们需要查看您的 RL_ADDRESS_PHONE 属性的定义以及您的 RaisePropertyChanged 方法的内容。另外,Will 的意思是 ALL_CAPS_PROPERTIES 通常被认为会降低代码的可读性。 Microsoft 发布了一个框架开发指南文档,其中包含他们的最佳实践,这就是其中提到的。
  • 感谢您的解释......我已经做了一个解决方法......现在它可以工作了
  • @Renanlf:你的意思是你解决了你上面描述的问题?如果是这样,您是否介意发布您修复的内容以使其他人受益?

标签: wpf listview mvvm datagrid prism


【解决方案1】:

TB_ADDRESSRL_ADDRESS_PHONE 属性也必须实现 INotifyPropertyChanged。如果是List,您应该使用实现INotifyCollectionChangedObservableCollection,这是您尝试实现的行为所必需的。

另外,作为一条建议 - 查看 C# 语言的设计指南和命名约定,您可以在 msdn 中找到它(虽然它说的是 .net 1.1,但它仍然适用于任何以下版本框架)。

【讨论】:

    【解决方案2】:

    您的装订有效吗?你检查过输出窗口吗?绑定路径上的所有属性都是公开的吗?需要更多代码。

    除了所有属性通知:如果您的绑定找到ObservableCollection,它在您添加对象时更新。因此,我认为您可能在路径上的某处使用了字段或非公共属性。

    如果不是这种情况,请确保不要覆盖对ObservableCollection 的引用,除非您有适当的PropertyChanged 通知。 (您应该在绑定路径上的每个类中实现该接口 (INotifyPropertyChanged),因为未通知视图的每个覆盖引用都会破坏您的更新)。

    【讨论】:

    • 对象 TB_COMPANY 来自 WCF 服务,它是来自 Entitys Framework 的 POCO。我已将服务设置为将所有集合作为 ObservableCollection
    • 是的,所有绑定都有效...我的 Tb 属性还有很多其他绑定,然后所有这些都有效...例如:
    • 添加了另一个问题来源。另外:还需要更多代码。
    【解决方案3】:

    您提到了使用 WCF 服务。您的可观察集合是否有可能在与 UI 线程不同的线程上创建。如果是这种情况,您的 UI 将无法绑定到它。 Bea Stollnitz 在她的博客上讨论了跨线程绑定的问题 -> http://bea.stollnitz.com/blog/?p=34

    您应该能够通过在 UI 线程上调用可观察集合的创建来绕过它。

    【讨论】:

    • 谢谢...但事实并非如此 =/
    猜你喜欢
    • 2016-12-17
    • 2014-09-24
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2014-11-23
    相关资源
    最近更新 更多