Bir WPF bağlaması yenilenmeye nasıl zorlanır?


112

Basit bağlama kullanılarak öğe kaynağı eklenmiş bir açılan kutum var. Birleşik giriş kutusu yüklendikten sonra bu bağlamayı yenilemenin herhangi bir yolu var mı?


1
Basit bağlama ile ne demek istiyorsun? Normalde bağlamayı kullandığınızda denetim otomatik olarak yenilenmelidir.
Erno

12
Techee, alınma ama HB'nin cevabının kabul edilmeyi hak ettiğine inanıyorum ;-)
Dani

1
@Dani Techee'nin geri döneceğinden emin değilim - giriş yapalı altı buçuk yıl oldu
The Lonely Coder

Yanıtlar:


198

Bağlama ifadelerini kullanabilirsiniz:

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

Ancak Blindmeis'in belirttiği gibi, değişiklik bildirimlerini de ateşleyebilirsiniz, ayrıca koleksiyonunuz uygularsa INotifyCollectionChanged(örneğin, içinde uygulanırsa ObservableCollection<T>) senkronize olur, böylece bunlardan herhangi birini yapmanız gerekmez.


ListBox kullanarak benim için bir şey yapmıyor gibi görünüyor.
Jonathan Wood

@JonathanWood: Bağlantınızın neye benzediği dahil, ne tür bir koda sahip olduğunuzu bilemiyorum. Bağlama ilk etapta çalışıyor mu?
HB

56

mvvm kullanıyorsanız ve itemsource, vm'nizde bulunuyorsa. Yenilemek istediğinizde koleksiyon mülkünüz için INotifyPropertyChanged'i çağırmanız yeterlidir.

OnPropertyChanged("YourCollectionProperty");

7
Bu en temiz yaklaşım imho.
Ash

Bu mümkün olduğunda yapılmalıdır, ancak her zaman pratik olmadığına dikkat edilmelidir. Örneğin, bir seri bağlantı noktasına bağlanıyorsanız ve açık, kapalı, baud hızı vb. Olup olmadığını kontrol etmek istiyorsanız, uygulayan seri bağlantı noktasının etrafında bir sarmalayıcı sınıfı oluşturabilirsiniz INotifyPropertyChanged, ancak bağlantı noktasını özel tutmanız gerekecektir. bu sarmalayıcı ve bu nedenle, projede başka bir yerde kullandığınız o bağlantı noktasındaki her şey için bir özellik ve yöntem yazmanız gerekir, böylece bildirimde bulunmak istediğiniz mülklerin her zaman paketleyiciden geçmesini sağlayın
Assimilater

8
Ayrıca, nameof(YourCollectionProperty)gerçek bir dizenin aksine kullanmanın büyük bir hayranıyım . Bu, hataların yeniden düzenlenmesini önler ve gerçekte neyin amaçlandığı daha açıktır. Elbette burası CallerMemberNamedaha da güzel olan özelliği kullanamayacağınız yer
Assimilater

31

2 sentimi eklemek için, veri kaynağınızı Kontrolünüzün yeni değeri ile güncellemek istiyorsanız, UpdateSource()bunun yerine şunu aramanız gerekir UpdateTarget():

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

1
Bu cevabı daha çok beğendim.
Chopnut

8

MultiBinding dostu versiyon ...

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


0

Arka uçtan veri alıyordum ve ekranı yalnızca bir satır kodla güncelledim. İşe yaradı. Emin değilim, neden Arayüzü uygulamamız gerekiyor? (Windows 10, UWP)

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

This.Bindings.update (), ekrandaki tüm bağlamaları yeniler. Bilginize
Itzdsp

Bunu denedim.Bindings.Update () UWP'deki bir kullanıcı kontrolünde ve mevcut değil.
James Esh

Evet. Ve bu Bağlamalar hala mevcut değil.
James Esh

2
Bindings.Update () yalnızca derlenmiş bağlamaların (x: Bind) kullanıldığı yerlerde kullanılabilir ... ve derlenmiş bağlamalar yalnızca
UWP'de

Lütfen @ MarianDolinský yorumuna bir göz atın. Xaml
Itzdsp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.