来自自定义属性的WPF数据绑定未更新

本文关键字:数据绑定 更新 WPF 自定义属性 | 更新日期: 2023-09-27 18:22:17

我是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 Text属性

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

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

非常感谢

来自自定义属性的WPF数据绑定未更新

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

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

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中。

将绑定从Text="{Binding FullName}"更改为应触发PropertyChanged事件的Text="{Binding FullName, Mode="OneWay", UpdateSourceTrigger="PropertyChanged"}"

与带有NotifyPropertyChanged(...)Patient属性一样,当属性Fullname发生更改时,您必须通知。为此,在三个属性的setter中调用NotifyPropertyChanged("FullName"):FirstName、MiddleName和LastName。

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

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

我似乎无法让它工作。我将该属性添加到了我的类中,因此对该类的任何更改都会通知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>

谢谢你的帮助。