2015-11-18 136 views
0

我新的WPF数据绑定和想不出它如何从我的视图模型更新属性WPF数据绑定的自定义属性不更新

我有一个类命名为患者

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" /> 

如何从类更新适用于我的FullName属性?我重新运行应用程序时会应用更新。

非常感谢

+0

也许你应该阅读一些像这样的文章 - http://blog.scottlogic.com/2012/04/05/everything-you-wanted-to-know-about-databinding-in-wpf-silverlight-and -wp7部分酮。html这里的问题是,你不通知用户界面FullName已经改变。我建议你要做的是为你的名字属性(FirstName,LastName ...)创建一个后台字段,并在setter中将值赋给后台字段后,调用NotifyPropertyChanged(“FullName”) – NValchev

+0

好的,谢谢@NValchev ,我会研究它。 – Chan

回答

1

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

这里最简单的解决方案是引发所有属性的NotifyProperty事件。你不会写很多代码,只是通过nullNotifyPropertyChanged();

private Data.Patient patient; 

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

它会告诉你的模型,所有属性已被更新。

MSDN:

PropertyChanged事件可以指示对象 在所有属性都通过使用空值或的String.Empty作为PropertyChangedEventArgs属性名 改变。

0

更改从Text="{Binding FullName}"您结合Text="{Binding FullName, Mode="OneWay", UpdateSourceTrigger="PropertyChanged"}"应该触发的PropertyChanged的事件。

0

NotifyPropertyChanged(...)一样Patient属性,您必须通知,当属性全名已更改。要做到这一点,请在三个属性的设置器中调用NotifyPropertyChanged("FullName"):FirstName,MiddleName和LastName。

也可以考虑,即NotifyPropertyChanged可能是零,因此使用:

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

我似乎无法使其工作。我将该属性添加到我的类中,以便对该类进行的任何更改都会通知用户界面,但仍然不能按我想要的方式工作。 但我找到了一个解决方案。

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

感谢您的帮助。