2011-06-17 20 views
6

Uygulama, C# ve WPF ile geliştirilmiştir. Statik olmayan bir sınıfın statik özelliğine bağlanan bir veri var. Uygulama başlatıldığında, ciltleme iyi çalışır, ancak bağlamanın boolunu değiştirirseniz, görünüm güncellenmez. Bu statik özelliğin bağını nasıl güncelleyebilirim? NotifyChanged-Events etkilenmez.Statik özelliklerin bağlayıcısını güncelleştirme

sınıfı:

public class ViewTemplateManager : NotifyBase 
{ 
    public static bool CanResizeColumns { get; set; } 

    static ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 

Görünüm:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}" 
+0

. Bunu, görünümünüzün temel bir sınıfı ile birleştirmek için miras veya bileşimi kullanabilirsiniz. Bunu yaparsanız, görünüm modelinizde özellik olarak CanResizeColumns sahip olacak ve OnPropertyChanged ("PropertyName") başarıyla kullanıyorsunuz? –

cevap

6

Bunu yapmanın tek yolu, ilişkili BindingExpression referansına sahip olmanızdır.

public class ViewTemplateManager : NotifyBase 
{ 
    public bool CanResizeColumns { get; set; } 

    public static ViewTemplateManager Instance { get; private set; } 

    static ViewTemplateManager() 
    { 
     Instance = new ViewTemplateManager(); 
    } 

    private ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 
} 

Ardından:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty); 
if (bindingExpression != null) 
    bindingExpression.UpdateTarget(); 

Yapabileceğiniz en iyi şey bu yüzden gibi bir singleton deseni kullanmak olacaktır: gibi

kodunuzda Thumb başvuru olması varsayarsak, bu olmazdı şöyle bağlamak:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}" 

Sonra sadece zaman yo INotifyPropertyChanged.PropertyChanged olay yükseltmek gerekir CanResizeColumns değiştir.

Sınıf özelliği:

+0

Tekil Desenle sorunsuz çalışıyor! – Gepro

2

Maalesef statik özellik için INotifyPropertyChanged bildirim mekanizması için doğrudan bir eşdeğer yoktur.

  1. statik üyesi döndüren bir örnek düzeyi özelliği olun:

    dahil birkaç seçenek vardır. Örneğin, örneğin PropertyChanged olayını ne zaman alabileceğini bildirmek için değişikliğin örneklerini bildiren özel bir mekanizma kullanın. Abonelikten çıkma veya Zayıf Olay kalıbı kullanma konusunda dikkatli değilseniz, bu durum çirkinleşebilir ve bellek sızıntılarına neden olabilir.

  2. Statik özelliği tekil olarak taşıyın ve tekil örneğinde örnek üye olarak yerleştirin. Bu, örneğin PropertyChanged olaylarını normal olarak yükseltmesine izin verir.
+0

'StaticPropertyChanged' – Wobbles

+0

@wobbles bu yanıttan sonra eklendi –

2

Sen mülkiyet statik değildir ya da sadece aynı zamanda statik olmayan yapmak ama sadece örneğin App durumda bir örneğini oluşturmak hangi bir Singleton kullanarak özelliklerini uygulamak ya (i ikincisi ile gider). Her iki durumda da INotifyPropertyChanged'u tekrar uygulayabilirsiniz.

0

Ben daha kolay çözüm olduğunu düşünüyorum

private static bool isEnabled; //there is Your static 

public bool IsEnabled 
{ 
    get { return isEnabled; } 
    set 
    { 
     isEnabled = value; 
     RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something 
    } 
} 

XAML: Bu sınıf statik neden anlamıyorum

<Button IsEnabled="{Binding IsEnabled}"/> 
İlgili konular