mvvm计算字段

时间:2013-01-09 14:14:10

标签: wpf wcf mvvm-light

我正在使用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引用的那一刻就会删除它

由于

2 个答案:

答案 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;
    }