0

私が(考えて)理解していることは、ModelView内にINotifyPropertyChangedを実装すると、プロパティが変更された場合にPropertyChangedイベントを発生させることができるということです。

そうすれば、基になるプロパティが変更されたことがビューに通知されるため、UI は新しい変更を取得する必要があります。

私は理論を正しく理解しましたか?

私が直面している問題は、ViewModel にバインドされた Infragistics DataGrid があることです。日付値を変更するとすぐに、ViewModel のプロパティが正しく設定され、イベントが発生する様子を確認できます。しかし、私はこのイベントを外部からサブスクライブしていませんが、UI はどのように通知を受けますか?

UIはまったく知られていないと思うので、私はこれを求めています。ViewModel を同じ基になる Model プロパティにバインドする 2 番目のテキスト ボックスを配置しました。ただし、DataGrid でそのプロパティを変更すると、TextBox (Mode=OneWay) は自動的に更新されません。

私は実際にMVVM-Light Frameの作業を利用し、INotifyPropertyChangedの代わりにViewModelBaseを使用し、RaisePropertyChanged(...)を実行します。しかし、結果は似ているはずです。

TextBox をその Event に手動でサブスクライブする必要がありますか?

編集: 問題は解決しましたが、なぜこれが起こっているのか正確にはわかりません。質問に答える前に、アーキテクチャについてもう少し説明する必要があります。Datgrid は、ViewModelB を返す ViewModelA の propertyA にバインドされ、ObservableCollection<ViewModelB>. 実際には Grid が表示するすべてのプロパティが含まれています。これらのプロパティはすべて OnProperyChanged の Setter で自然に発生します。

TextBox は、ViewModelA 内にも存在する PropertyB にバインドされました。ただし、直接文字列を返すため、PerpertyB の基になるゲッターは次のように返します。

_cashflowInputs[0].ProjectedDate.ToString();

ただし、TextBox をこの propertyB にバインドせずに、PropertyA にもバインドすると、次のように機能します。

それは奇妙だ。私はそれが同じように機能することを期待していました。両方のプロパティが同じ ViewModel に存在し、同じ にアクセスしますprivate ObservableCollection<ViewModelB>。なぜそれが問題になるのでしょうか?

public ObservableCollection<ViewModelB> PropertyA
        {
            get { return _cashflowInputs;}
        }

        public string PropertyB
        {
            get { return _cashflowInputs[0].ProjectedDate.ToString(); }
        }

ケーブ

4

3 に答える 3

2

ここでは、データ オブジェクトが INotifyPropertyChanged を実装している場合に、データ オブジェクトと UI 要素の間の通知がどのように機能するかを簡単に確認します。

1) プロパティを変更するために、データ オブジェクトのプロパティ セッターが呼び出されます。

2) セッター内で、データ オブジェクトはプロパティ値を変更し、プロパティが変更されたデータ オブジェクトにバインドされたすべての UI 要素に通知するイベントを発生させます。発生したイベントには、変更されたばかりのプロパティの名前が含まれます。

3) UI 要素がイベントを処理し、イベント引数を調べて、どのプロパティが変更されたかを判断します。

4) UI 要素はどのプロパティが変更されたかを認識したので、適切な getter を呼び出して最新のプロパティ値を取得し、その値で自身を更新します。

だから、あなたの例では。プロパティ「ProjectedDate」が更新されると、プロパティ名「ProjectedDate」を UI 要素に渡すイベントが発生します。次に、UI 要素は「ProjectedDate」プロパティのゲッターを呼び出して自身を更新します。

プロパティ名 'PropertyB' を引数としてイベントが発生しなかった場合、UI 要素は 'PropertyB' が変更されたことを認識しません。したがって、「PropertyB」にバインドされている場合、新しい値で更新されません。ある時点で、UI 要素が最新のプロパティ値で更新する必要があることを知るために、イベント引数としてプロパティ名 'PropertyB' を使用してイベントを発生させる必要があります。

于 2010-07-07T15:50:34.663 に答える
0

コントロールのデータ コンテキストが ViewModelB になるため、DataGrid のデータ テンプレート内のコントロールの PropertyB へのバインドは機能しません。データ テンプレート内の要素をデータ テンプレートのコンテキスト外のものにバインドする場合は、そのデータ コンテキストを別のものに設定するか、要素間データ バインディングを使用してデータ テンプレート外のものにバインドする必要があります。

于 2010-07-07T22:14:49.143 に答える
0

テキストボックスにバインドを設定しましたか?

<TextBox Text="{Binding Path=PathToMyValue}"/>
于 2010-07-07T13:43:01.873 に答える