WPFバインディングを強制的に更新する方法は?


112

シンプルなバインディングを使用してアイテムソースがアタッチされたコンボボックスがあります。コンボボックスが読み込まれた後、このバインディングを更新する方法はありますか?


1
単純なバインディングとはどういう意味ですか?通常、バインディングを使用すると、コントロールは自動的に更新されます。
Erno

12
Techee、違反はありませんが、HBは彼の答えが受け入れられるに値すると思います;-)
Dani

1
@ダニTecheeが戻ってくるとは思えない-彼がログインしてから6年半
The Lonely Coder

回答:


198

バインディング式を使用できます。

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

ただし、Blindmeisが指摘したように、変更通知を起動することもできます。さらに、コレクションが実装されている場合INotifyCollectionChanged(たとえば、で実装されている場合ObservableCollection<T>)は同期するため、これを行う必要はありません。


ListBoxを使用して私のために何かをするようではないようです。
ジョナサンウッド

@JonathanWood:まあ、私はあなたのバインディングがどのように見えるかを含めて、あなたがどんな種類のコードを持っているのかを理解することはできません。バインディングはそもそも機能しますか?
HB 2016

56

mvvmを使用し、itemssourceがvmにある場合。更新したいときは、コレクションプロパティのINotifyPropertyChangedを呼び出すだけです。

OnPropertyChanged("YourCollectionProperty");

7
これが最もクリーンなアプローチです。
アッシュ

これは可能な限り行う必要がありますが、常に実用的であるとは限らないことに注意してください。たとえば、シリアルポートにバインドしていて、それが開いているか、閉じているか、ボーレートなどを確認する場合は、シリアルポートの周りにラッパークラスを作成して、を実装INotifyPropertyChangedすることができますが、ポートを非公開にしておく必要があります。そのラッパー、つまり、プロジェクトの他の場所で使用するそのポートのすべてのプロパティとメソッドを記述して、通知対象のプロパティが常にラッパーを通過するようにする必要があります
Assimilater

7
また、私はnameof(YourCollectionProperty)文字列ではなく使用することの大ファンです。これにより、バグがリファクタリングされるのを防ぎ、実際の意図がより明確になります。これはもちろん、CallerMemberNameより良い属性を使用できない場所です
Assimilater

31

私の2セントを追加するには、データソースをコントロールの新しい値で更新する場合は、次のUpdateSource()代わりにを呼び出す必要がありますUpdateTarget()

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
私はこの答えが好きです。
チョップナット

8

MultiBindingフレンドリーバージョン...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

私はバックエンドからデータをフェッチし、画面を1行のコードで更新しました。出来た。わからない、なぜインターフェイスを実装する必要があるのか​​。(Windows 10、UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update()は、画面内のすべてのバインディングを更新します。FYI
Itzdsp 2016

UWPのユーザーコントロールでthis.Bindings.Update()を試しましたが、存在しません。
James Esh

はい。そしてthis.Bindingsはまだ存在しません。
James Esh

2
Bindings.Update()は、コンパイルされたバインディング(x:Bind)が使用されている場合にのみ使用できます。コンパイルされたバインディングは、UWPでのみ使用できます
MarianDolinskýDec

@MarianDolinskýのコメントをご覧ください。
xaml
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.