2016-04-17 12 views
1

はのは、私はアイテムのListViewコントロールと選択した項目のプロパティ(テキスト)を編集するテキストボックスでMVVMアプリケーションがあるとしましょう。自動INotifyPropertyChangedのは、ビューの変更後

<TextBox Text="{Binding SelectedItem.Text}"/> 
<ListBox ItemsSource="{Binding Items}" DisplayMemberPath="Text" SelectedItem="{Binding SelectedItem}" 

私のViewModelにはObservableCollection Itemsがあります。各アイテムは、INotifyPropertyChangedを実装し、requieredプロパティを持ちます。私は私のTextBoxのテキストを変更した場合、私は、通知なしで唯一のプロパティを持っているので、リストが更新されていません。

public class Item : INotifyPropertyChanged 
{ 
    public string Text { get; set; } 
} 

私の質問は:使用せずに、私のリストのテキスト・プロパティを更新する方法はありますまたは異なるアプローチ - これが私のTextBoxのテキストを変更した後、私のビューから直接にPropertyChangedを発射する方法はあり

private string _Text; 
public string Text 
{ 
    ... 
    set 
    { 
    _Text = value; 
    PropertyChanged("Text"); 
    } 
} 

を?:ようにPropertyChanged?

ありがとうございました!

+0

どこ 'TextBox'はありますか?私は 'TextBlock'だけを見ます。ビューモデルから 'PropertyChanged'イベントを呼び出すことができないのはなぜですか? – dkozl

+0

バックあなたは左下今削除されたコメントに移動し、あなたは左のリンクをたどります。その答えが言っていることを読んでください。次に 'Text'プロパティを使って' Item'クラスと比較してください。答えはあなたを顔で見つめている。 – slugster

+0

@ dkozl:TextBlockをTextBoxに変更しました...私の間違いです。 (:http://stackoverflow.com/questions/7767218/why-does-the-binding-update-without-implementing-inotifypropertychangedここを見て)INotifyPropertyChangedのを実装しなければ、任意の通知なしで働いていました。今(これは最低限の例です) – Fruchtzwerg

答えて

0

さて、私が代わりに少し謎めいたコメント(あなたはむしろspoonfedされているよりも、答えは自分自身を発見した場合、あなたが実際よりよく学ぶので、私がやった...)の答えを残しておきます。

previous linkあなたの左の状態:

そして、あなたはINotifyPropertyChangedのを実装している場合は、UIにバインドされたデータにする必要があるプロパティのすべてのセッターに変更通知を実装する完全に責任があります。そうしないと、期待どおりに変更が同期されません。

(完成のために、ここにその答えで残ったリンク:MSDN forums: Data binding without INotifyPropertyChanged)です。

以前はあなたはWPFのデフォルトの動作に依存していましたが、INotifyPropertyChangedを実装すると効果的に「Yo WPF !!」というメッセージが表示されます。後ろに座って! "。その後、Textプロパティで通知を追加できませんでした。したがって、コード化の決定に従って、WPFバインディングは、特別にトリガーしない限り、そのクラスのプロパティの変更を検出しなくなりました。

個人的に私は常にINotifyPropertyChangedを実装しています。なぜなら、PropertyDescriptorがデフォルトでこれを検出しないために、コードによって値が変更されてもプロパティの変更が通知されるからです。さらに、それは私に、通知しない、または複数のプロパティが変更された場合に通知する柔軟性を与えます。

+0

答えてくれてありがとう@slugster。これは非常に明確な説明です。リンクは、WPFがINPCなしでPropertyDescriptorに自動的にバインドしていることを示しています。私の場合は、コードからTextプロパティの変更を検出する必要はありません。私のオブジェクト全体にINPCを使用する方法や回避策はありますか?また、この単一のTextプロパティに対してのみWPF自動メカニズムを使用できますか? – Fruchtzwerg

+0

いいえ、そのように両方を行う方法はありません。 INPCを使用すると、あなたは完全にコントロールできます。あなたはプロセスを簡素化することができますが、賢明なビットを削除する私の[この古い答え](http://stackoverflow.com/a/13720780/109702)をチェックしてください(その答えのコードは、以前の.Net 4.5とCallerMemberName )。これは単なる例でもありますが、そのアプローチをさまざまな方法で拡張することができます(http://blog.amusedia.com/2013/06/inotifypropertychanged-implementation.html)。 – slugster

+1

あなたの素晴らしい答えをありがとう!それは本当に私のプロジェクトで聞きたい答えではありませんでした...しかし、今私は正確な問題が何であるか知っています。 – Fruchtzwerg

関連する問題