Bagaimana cara memaksa pengikatan WPF untuk disegarkan?


112

Saya punya kotak kombo dengan sumber item yang dilampirkan menggunakan penjilidan sederhana. Apakah ada cara untuk menyegarkan penjilidan ini setelah kotak kombo dimuat?


1
Apa yang Anda maksud dengan penjilidan sederhana? Biasanya saat Anda menggunakan penjilidan, kontrol akan otomatis di-refresh.
Erno

12
Techee, jangan tersinggung, tapi saya yakin HB layak menerima jawabannya ;-)
Dani

1
@Dani Saya tidak yakin Techee akan kembali - enam setengah tahun sejak dia masuk
The Lonely Coder

Jawaban:


198

Anda dapat menggunakan ekspresi binding:

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

Tetapi seperti yang dicatat oleh Blindmeis, Anda juga dapat mengaktifkan pemberitahuan perubahan, lebih lanjut jika koleksi Anda diterapkan INotifyCollectionChanged(misalnya diterapkan di ObservableCollection<T>) maka akan disinkronkan sehingga Anda tidak perlu melakukan semua ini.


Sepertinya tidak melakukan apa-apa untuk saya menggunakan ListBox.
Jonathan Wood

@JonathanWood: Yah, saya tidak tahu jenis kode apa yang Anda miliki, termasuk seperti apa pengikatan Anda. Apakah pengikatan itu berhasil?
HB

56

jika Anda menggunakan mvvm dan itemssource Anda terletak di vm Anda. cukup panggil INotifyPropertyChanged untuk properti collection Anda ketika Anda ingin menyegarkan.

OnPropertyChanged("YourCollectionProperty");

7
Ini adalah pendekatan terbersih imho.
Abu

Ini harus dilakukan jika memungkinkan, tetapi perlu dicatat bahwa ini tidak selalu praktis. Misalnya jika Anda mengikat ke port serial, dan ingin memeriksa apakah itu terbuka, tertutup, baud rate, dll Anda dapat membuat kelas pembungkus di sekitar port serial yang diimplementasikan INotifyPropertyChanged, tetapi Anda harus menjaga port tetap privat untuk pembungkus itu dan karenanya perlu menulis properti dan metode untuk semua yang ada di port yang Anda gunakan di tempat lain dalam proyek untuk memastikan bahwa properti yang ingin Anda beri tahu selalu melalui pembungkus
Assimilater

8
Juga, saya penggemar berat penggunaan yang nameof(YourCollectionProperty)bertentangan dengan string literal. Ini mencegah bug melakukan refactoring dan lebih eksplisit apa yang sebenarnya dimaksudkan. Ini tentu saja di mana Anda tidak dapat menggunakan CallerMemberNameatribut yang bahkan lebih bagus
Assimilater

31

Untuk menambahkan 2 sen saya, jika Anda ingin memperbarui sumber data Anda dengan nilai baru Kontrol Anda, Anda perlu memanggil UpdateSource()alih-alih UpdateTarget():

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

1
Saya lebih menyukai jawaban ini.
Chopnut

8

Versi ramah MultiBinding ...

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


0

Saya mengambil data dari backend dan memperbarui layar hanya dengan satu baris kode. Berhasil. Tidak yakin, mengapa kita perlu mengimplementasikan Interface. (windows 10, UWP)

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

This.Bindings.update () menyegarkan semua binding di layar. FYI
Itzdsp

Saya mencoba this.Bindings.Update () di usercontrol di UWP dan tidak ada.
James Esh

Iya. Dan ini.Bindings masih belum ada.
James Esh

2
Bindings.Update () hanya tersedia jika binding terkompilasi (x: Bind) digunakan ... dan binding terkompilasi hanya tersedia di UWP
Marian Dolinský

Silakan lihat komentar @ MarianDolinský. Sepertinya Anda harus mengikat dari xaml
Itzdsp
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.