2012-04-18 8 views
4

Matt Hamiltonは、バージョン4.5では静的変数を使用した双方向モードでのバインディングが可能です。 残念ながら、V4.5 istはまだベータですが、私のコードを変更して、最終的に正しいアプリを稼働させることにしました。WPFでの双方向バインディングは、静的メンバーでは機能しません。

私は非常に単純なクラスのRecallConnectionSettings」を持っている: -

は、しかし、まだ、私はここで行く、同様の問題を抱えています。このクラスのこのメンバーは、どこでも、コード内からアクセスする必要がありますので、私は(このような)それらは、静的作ることを決めた:

public class RecallConnectionSettings 
    { 
      private static string Server {get;set;} 
    } 

あなたが見ることができるように1つだけの変数は、「サーバ」があります。 私が欲しいのは、2WayModeをTextBox Textプロパティからその 'Server'値にバインドすることです。

だから私はこれを試してみました:

<UserControl....> 
    <UserControl.Resources> 
      <local:RecallConnectionSettings x:Key="recallConf"/> 
    </UserControl.Resources> 
    <TextBox Text="{Binding Source={StaticResource recallConf}, Path=Server, 
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... Name="txtServerAdress" /> 
</UserControl> 

私はテキストボックスの値を変更したときにこれは素晴らしい作品 - ではなく、他の側から。 「サーバー」の値を手で変更すると、テキストボックスのテキストプロパティが更新されません。

もちろん、私の知る限り、私はRecallConnectionSettingsクラスにINotifyPropertyを実装する必要があります。 - これはあまりにも動作しないことができる

public class RecallConnectionSettings : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 
    private static string s_server; 

    public static string Server 
      { 
       get { return s_server; } 
       set 
       { 
        s_server = value; 
        OnPropertyChanged("Server"); 
       } 
      } 

public static event PropertyChangedEventHandler PropertyChanged; 



protected static void OnPropertyChanged(string name) 
      { 
       PropertyChangedEventHandler handler = PropertyChanged; 
       if (handler != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(name)); 
       } 
      } 
    } 

まあ: それからそれはこのようになります。静的メソッドしかないので、クラスインスタンスを使用してイベントを呼び出すことはできません:

PropertyChanged(this, new PropertyChangedEventArgs(name)); 

これからどうしたらいいですか? 私はシングルトンを使用して考えたので、私はこれでした:

public class RecallConnectionSettings : INotifyPropertyChanged 
    { 
     private static RecallConnectionSettings instance; 

     private RecallConnectionSettings(){} 

     public static RecallConnectionSettings Instance 
     { 
      get 
      { 
       if(instance == null) 
       { 
        instance = new RecallConnectionSettings(); 
       } 
       return instance; 
      } 
     } 
// ... here comes the other stuff 
} 

は、私も私のユーザーコントロールを準備する必要があり、それを動作させるためには、私はこれでした:ありこの時点で

...  
<UserControl.DataContext> 
      <local:RecallConnectionSettings/> 
</UserControl.DataContext> 
... 

を試行する必要はありません。これを行うには、デフォルトのコンストラクタが公開されている必要があります。

私がやっていることは何でも:それは動作しません。 私はまだその仕組みが理解できないように思えます。あなたはとても親切で、私にそのトリックを見せてくれますか?

+2

あなたはINotifyPropertyChangedのから派生べきではないのですか? – stijn

+0

VSの "output - debug"には何も表示されていますか? バインドでデバッグを有効にしましたか? @stijnのように、あなたはINotifyPropertyChangedから派生する必要があります –

+0

くそー - あなたは正しいです。私はもう一度それを試してみます。どうも。 – CodeCannibal

答えて

2

シングルトン液を保持し、これを置き換えます。これにより

...  
<UserControl> 
    <UserControl.DataContext> 
     <local:RecallConnectionSettings/> 
    </UserControl.DataContext> 
    ... 
</UserControl> 
... 

を:

...  
<UserControl DataContext="{x:Static local:RecallConnectionSettings.Instance}"> 
    ... 
</UserControl> 
... 
+0

インスタンスが認識されません... – user1034912

0

WOW - 感謝ニコラス、それは働きます!他の読者のために

- ここでは、あなたが今、テキストボックスをコードしなければならないものである:

<TextBox Text="{Binding Path=Server, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="txtServerAdresse"/> 
+0

は機能しませんが、変更時にデータが更新されない – user1034912

関連する問題