2011-06-17 144 views
6

該應用程序是用C#和WPF開發的。 我有一個數據綁定到非靜態類的靜態屬性。 當應用程序啓動時,綁定表現良好,但是如果我更改了綁定的布爾值,則視圖不會被更新。 如何更新此靜態屬性的綁定? NotifyChanged - 事件不受影響。更新靜態屬性的綁定

類:

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

    static ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 

的觀點:

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

我不明白爲什麼這個類是靜態的。您可以使用繼承或可組合性將其與視圖模型的基類結合使用。如果你這樣做,你將視圖模型上的CanResizeColumns作爲屬性併成功使用OnPropertyChanged(「PropertyName」)? –

回答

6

要做到這一點的唯一方法是如果你有一個參考相關的BindingExpression

假設你已經在你的代碼的拇指參考,它看起來像:

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

你最好的選擇是使用一個單例模式,就像這樣:

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; 
    } 
} 

然後綁定像這樣:

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

然後你只需要提出INotifyPropertyChanged.PropertyChanged事件時,喲你改變CanResizeColumns。

+0

它可以正常使用Singleton模式! – Gepro

2

不幸的是,沒有直接等同於INotifyPropertyChanged的靜態屬性的通知機制。

有幾個選項,包括:

  1. 使返回的靜態成員的實例級屬性。使用自定義機制來通知更改的實例,此時實例可以提升PropertyChanged事件。如果您不注意取消訂閱或使用弱事件模式,這可能會變得醜陋並引入內存泄漏。
  2. 將靜態屬性移動到單例中,並將其作爲單例實例上的實例成員放置。這允許該實例正常地提升PropertyChanged事件。
+0

有'StaticPropertyChanged' – Wobbles

+0

@wobbles在此回答後添加了 –

2

您可以實現使用Singleton該財產是不是靜態的,或者你也使其成爲非靜態的,而是你剛纔在App實例例如創建一個實例的屬性(我會去與後者)。無論哪種情況,您都可以再次實施INotifyPropertyChanged

0

我認爲這是簡單的解決方案:

類屬性:

private static bool isEnabled; //there is Your static 

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

XAML:

<Button IsEnabled="{Binding IsEnabled}"/>