0

wcf サーバーと通信する wpf アプリケーションに MVVM ライト ツールキットを使用しています。

wcf サーバーは Person オブジェクト (プロキシ オブジェクト) を返します。この人物オブジェクトには、名前、姓などのいくつかのフィールドがあります。私のビューモデルは Web サービスを呼び出し、このモデルの戻り値を取得します。私のビューはviewmodelのモデルにバインドされており、フィールドは各UIテキストボックスに正しくバインドされています。

日陰ではすべて涼しく、システムはうまく機能します。

モデルの 2 つのフィールドは、DateOfBirth と NationalIDNumber です (fyi: 南アフリカでは、ID 番号から個人の生年月日を導き出すことができます)。

したがって、ユーザーが NationalIdNumber を入力または更新した後 (利用可能な場合)、DOB も決定したいと思います。

ただし、DOB は WCF サービスから返された初期フィールドにマップする必要があるため、コンバーターを使用して NationalIdNumber にバインドすることはできません。永続化できるように、wcf プロキシの DOB フィールドにバインドされたままにする必要があります。

これをどのように実装するのが最善ですか?

これが mvvm 以外のプロジェクトである場合は、IDNumber テキスト フィールドにイベントを配置して、フォーカスが失われた場合に、そこから dob を計算してみて (その中のテキストがゴミの場合は常に可能であるとは限りません)、値を上書きします。 Dob テキストボックスの。

Person オブジェクトの NationalIdNumber セッターを微調整することだけを考えていましたが、これは Web サービス参照を更新した瞬間に削除されます

ありがとう

4

2 に答える 2

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 に答える
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 のセッターが呼び出されます。

...

編集:

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 に答える