我正在使用MVVM light工具包来处理与wcf服务器通信的wpf应用程序。
wcf服务器返回一个Person对象(代理对象)。 此人物对象有几个字段,名称,姓氏等。 我的viewmodel调用webservice,然后返回此模型。 我的视图绑定到viewmodel的模型,并且字段正确绑定到每个ui文本框。
在阴凉处都很酷,系统功能很好。
模型上的两个字段是DateOfBirth和NationalIDNumber (fyi:在南非,您可以从身份证号码中获得出生日期)
因此,在用户输入或更新NationalIdNumber(如果可用)之后,我也希望确定DOB。
但是DOB仍然必须映射到从WCF服务返回的初始字段,所以我不能用转换器将它绑定到NationalIdNumber。它需要保持绑定到wcf代理的DOB字段,以便它可以被持久化。
我应该如何实现这一目标?
如果这是一个非mvvm项目,我只会在IDNumber文本字段上放置一个事件,这样如果它失去焦点,尝试从中计算一个dob(如果它中的文本是垃圾可能并不总是可能)然后覆盖Dob文本框的值。
我在考虑调整Person对象NationalIdNumber setter,但是在我更新webservice引用的那一刻就会删除它
由于
答案 0 :(得分:1)
您可以在视图模型中使用Person属性:
视图模型:
public class PersonViewModel : INotifyPropertyChanged
{
Person person = new Person();
public Person Person
{
get
{
return person;
}
set
{
person = value;
NotifyPropertyChanged("Person");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
查看:
<TextBox Text="{Binding Person.NationalIDNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Height="23" HorizontalAlignment="Left" Margin="128,98,0,0"
Name="textBox1" VerticalAlignment="Top" Width="120" />
因此,每当您更新Person的属性时,都会调用Person的setter。
...
修改强>
使用MvvmLight:
视图模型:
public class PersonViewModel : ViewModelBase
{
Person person = new Person();
public Person Person
{
get
{
return person;
}
set
{
person = value;
RaisePropertyChanged("Person");
}
}
}
查看:
<TextBox Text="{Binding Person.NationalIDNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Height="23" HorizontalAlignment="Left" Margin="128,98,0,0"
Name="textBox1" VerticalAlignment="Top" Width="120" />
答案 1 :(得分:1)
public class PropertyHelpersViewModel : INotifyPropertyChanged
{
private string text;
public string Text
{
get { return text; }
set
{
if(text != value)
{
text = value;
RaisePropertyChanged("Text");
}
}
}
protected void RaisePropertyChanged(string propertyName)
{
var handlers = PropertyChanged;
if(handlers != null)
handlers(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}