0

我正在将 MVVM 轻工具包用于与 wcf 服务器对话的 wpf 应用程序。

wcf 服务器返回一个 Person 对象(代理对象)。这个人对象有几个字段,名字、姓氏等。我的视图模型调用了 web 服务,然后得到了这个模型的返回。我的视图绑定到 viewmodel 的模型,并且字段正确绑定到每个 ui 文本框。

阴凉处,系统运行良好。

模型上的两个字段是 DateOfBirth 和 NationalIDNumber(仅供参考:在南非,您可以从 ID 号得出一个人的出生日期)

因此,在用户输入或更新 NationalIdNumber(如果可用)之后,我也希望确定 DOB。

但是 DOB 仍然必须映射到从 WCF 服务返回的初始字段,所以我不能用转换器将它绑定到 NationalIdNumber。它需要保持绑定到 wcf 代理的 DOB 字段,以便它可以持久化回来。

我应该如何最好地实施这个?

如果这是一个非 mvvm 项目,我只会在 IDNumber 文本字段上放置一个事件,以便如果它失去焦点,请尝试从中计算一个 dob(如果其中的文本是垃圾,则可能并不总是可能)然后覆盖该值Dob 文本框。

我正在考虑只调整 Person 对象 NationalIdNumber 设置器,但这将在我更新 web 服务引用的那一刻被删除

谢谢

4

2 回答 2

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" />
于 2013-01-09T14:31:36.867 回答
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;
    }
于 2013-01-09T14:47:36.240 回答