1

私は C# と WPF がまったく初めてで、データ バインディングで最善を尽くそうとしています。INotifyPropertyChanged; を実装する MyClass があります。そのため、プロパティ値を変更するたびに、これが UI で更新されます。次に、stackpanel の DataContext を MyClass のオブジェクトにバインドしました。このような:

<StackPanel Name="stackPanel1" DataContext="{Binding}">
        <TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
</StackPanel>

コード ビハインドでは、次のようにします。

item = new MyClass();
stackPanel1.DataContext = item;

バインディングは正常に機能しています。現在のバインディング ソース オブジェクトを別のものに置き換える場合は、datacontext バインディングをもう一度入力して手動で設定する必要があります。

item = new MyClass();
stackPanel1.DataContext = item;
item1 = new MyClass();
.
. //manipulate item1
.
if (item1 is ok)
   item=item1;
   stackPanel1.DataContext = item;

ソース オブジェクトを置き換えて、関連付けられているすべてのバインディングを更新するより良い方法はありますか?

4

3 に答える 3

1

あなたが言うときstackPanel1.DataContext = item;、あなたはそれをバインドしているのではなく、プロパティを設定しています。

プロパティを設定すると、オブジェクトのインスタンスと同じに設定されます。バインドすると、他の場所から値を取得することになるため、値を取得する必要があるときはいつでもその場所を調べます。

バインドされたプロパティを含むクラスにINotifyPropertyChangedを実装すると、バインドされたプロパティが変更されるたびに UI にアラートが送信され、バインディングが再評価されます。

たとえば、DataContext最初に

MyWindow.DataContext = this;

あなたのウィンドウはどこthisにあり、あなたのウィンドウには とMyClass呼ばれるタイプのプロパティがありました。次に、次を使用して をItemバインドできますDataContext

<StackPanel DataContext="{Binding Item}" ...>

また、プロパティを更新するItemと、StackPanelDataContextも更新されます ( INotifyPropertyChangedを実装している場合)。

興味があれば、私は WPF の初心者向けの概念についてブログを書いています。あなたが話しているこの "DataContext" とは何ですか? 、これは とは何か、DataContextどのように使用されるかについての非常に簡単な説明です。

要約すると、WPF には UI レイヤーとデータ レイヤーの 2 つのレイヤーがあります。はDataContextデータ レイヤーであり、 を記述すると{Binding SomeProperty}、実際にはデータ レイヤーにバインドされます。通常DataContext、コード ビハインドでデータ レイヤー ( ) を 1 回設定してから、XAML でバインディングを使用して、UI レイヤーにデータ レイヤーからの情報を表示させます。

(非常に単純な作業コード サンプルが含まれており、実装方法と UI レイヤーとデータ レイヤーを完全に分離する方法の例を示している、私のSimple MVVM Exampleもご覧ください)INotifyPropertyChanged

于 2013-02-12T16:43:16.330 に答える
0
DataContext="{Binding}"

stackPanel1.DataContext = item;

どちらも基本的に同じことをします。違いは、一方がXAMLで実行され、もう一方がコードで実行されることです。最初の例では、バインディングの親を指定してバインディングを更新できますが、2番目の例では、スタックパネルの接続先を変更するたびに更新する必要があります。私見では、バインドする共通のバインド親を作成する必要があります。これにより、毎回コンテキストを設定しなくても、子バインディングを変更できます。

<StackPanel Name="parentPanel">
    <StackPanel Name="stackPanel1" DataContext="{Binding Path=Child}">
            <TextBlock Name="textBlock1" Text="{Binding Path=Title, Mode=OneWay}" />
    </StackPanel>
</StackPanel>


parent = new ParentClass();
parent.Child= new MyClass();
parentPanel.DataContext = parent ;

これで、変更された通知プロパティがParentClassで正しく作成された場合、子スタックパネルのバインディングを変更できます。

parent.Child= new NewClass();
于 2013-02-12T16:20:39.197 に答える
0

CurrentItemMainWindow (または UserControl など) にプロパティを追加し、INotifyPropertyChangeそのプロパティを実装することもできます。次に設定

DataContext = this;

MainWindow のコンストラクターで、次のようにバインドします。

Text="{Binding Path=CurrentItem.Title}" 

設定するたびに

var item = new MyClass();
...
CurrentItem = item;

バインディングが更新されます。

于 2013-02-12T16:19:53.573 に答える