【问题标题】:WPF Databinding from custom property not updating来自自定义属性的 WPF 数据绑定未更新
【发布时间】:2015-11-18 16:58:57
【问题描述】:

我是 WPF 数据绑定的新手,不知道如何从我的视图模型中更新属性

我有一个名为 Patient 的类

public string FirstName { get; set; } = "";
public string MiddleName { get; set; } = "";
public string LastName { get; set; } = "";

正在对患者类进行更新

private Data.Patient patient;
public Data.Patient Patient
{
     get { return patient; }
     set
     {
          patient = value;
          NotifyPropertyChanged("Patient");
     }
}

我的视图模型上的一个属性,患者类没有更新

public string FullName
{
     get { return Patient.LastName + " " + Patient.FirstName + " " + Patient.MiddleName; }
}

我正在尝试更新 TextBlock 文本属性

 <TextBlock Text="{Binding FullName}" FontSize="14.667" />

如何将更新从 Class 应用到我的 FullName 属性?重新运行应用程序时会应用更新。

非常感谢

【问题讨论】:

  • 也许您应该阅读一些类似这样的文章 - blog.scottlogic.com/2012/04/05/… 这里的问题是您没有通知 UI FullName 已更改。我建议您为您的名称属性(名字,姓氏...)创建一个支持字段,并在设置器中,将值分配给支持字段后,调用 NotifyPropertyChanged("FullName")
  • 好的,谢谢@NValchev,我会调查的。

标签: c# wpf mvvm data-binding


【解决方案1】:

您的问题是您没有通知 UI Fullname 属性已更改。从技术上讲,它没有改变,但它依赖于其他一些属性。

这里最简单的解决方案是为所有属性引发 NotifyProperty 事件。您不必为此编写大量代码,只需将null 传递到NotifyPropertyChanged(); 即可

private Data.Patient patient;

public Data.Patient Patient
{
     get { return patient; }
     set
     {
          patient = value;
          NotifyPropertyChanged(null); //informs view that all properties updated
     }
}

它会告诉您的模型所有属性都已更新。

MSDN:

PropertyChanged 事件可以指示对象上的所有属性 已通过使用 null 或 String.Empty 作为属性名称进行了更改 在 PropertyChangedEventArgs 中。

【讨论】:

    【解决方案2】:

    将您的绑定从 Text="{Binding FullName}" 更改为 Text="{Binding FullName, Mode="OneWay", UpdateSourceTrigger="PropertyChanged"}",这应该会触发 PropertyChanged-Event。

    【讨论】:

      【解决方案3】:

      就像Patient 属性与NotifyPropertyChanged(...) 一样,您必须在属性全名更改时通知。为此,请在三个属性的设置器中调用 NotifyPropertyChanged("FullName"):FirstName、MiddleName 和 LastName。

      还请考虑,NotifyPropertyChanged 可能为 null 并因此使用:

      if (NotifyPropertyChanged != null)
          NotifyPropertyChanged("FullName");
      

      【讨论】:

        【解决方案4】:

        我似乎无法让它工作。我将该属性添加到我的类中,因此对类的任何更改都将通知 UI,但它仍然没有按我想要的方式工作。 但我找到了解决办法。

        <TextBlock FontSize="14.667">
             <TextBlock.Text>
                  <MultiBinding StringFormat=" {0} {1} {2}">
                       <Binding Path="Patient.LastName" />
                       <Binding Path="Patient.FirstName"/>
                       <Binding Path="Patient.MiddleName"/>
                  </MultiBinding>
             </TextBlock.Text>
        </TextBlock>
        

        感谢您的帮助。

        【讨论】:

          猜你喜欢
          • 2011-12-14
          • 1970-01-01
          • 2013-04-23
          • 2016-06-08
          • 2014-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          相关资源
          最近更新 更多