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?

Techee
sumber
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.

HB
sumber
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");
buta
sumber
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();
dotNET
sumber
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();
}
Tempeck
sumber
6

Coba gunakan BindingExpression.UpdateTarget()

Kushal Waikar
sumber
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();
    }
Itzdsp
sumber
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