2011-06-17 24 views
6

アプリケーションはC#およびWPFで開発されています。 私は静的でないクラスの静的プロパティへのデータバインディングを持っています。 アプリケーションが起動するとバインディングはうまくいきますが、バインディングのboolを変更すると、ビューは更新されません。 この静的プロパティのバインディングを更新するにはどうすればよいですか? 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

このクラスは静的である理由私は理解していません。継承または合成を使用して、これをビューモデルの基本クラスと組み合わせることができます。それを行うと、ViewModelの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

シングルトンパターンでうまく動作します! – Gepro

2

残念ながら、静的プロパティのINotifyPropertyChangedの通知メカニズムに直接相当するものはありません。

オプションのカップルには、があります。

  1. 静的メンバを返し、インスタンスレベルのプロパティを確認します。カスタムメカニズムを使用して、変更のインスタンスに通知します。この時点で、インスタンスはPropertyChangedイベントを発生させることができます。これは、登録解除や弱いイベントパターンの使用を慎重にしないと、醜くなり、メモリリークを引き起こす可能性があります。
  2. staticプロパティをシングルトンに移動し、シングルトンインスタンスにインスタンスメンバーとして配置します。これにより、そのインスタンスは通常どおりPropertyChangedイベントを発生させることができます。
+0

'StaticPropertyChanged'があります – Wobbles

+0

@wobblesがこの回答の後に追加されました –

2

あなたはプロパティは静的ではありませんか、あなただけのも、それは非静的作るが、あなただけ例えばAppインスタンス内の1つのインスタンスを作成した上でSingletonを使用してプロパティを実装するか(私は後者となるだろう)。いずれの場合も、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}"/> 
関連する問題