4

Matt Hamilton は、WPF に関する興味深い事実を教えてくれました。バージョン 4.5 では、静的変数を使用した双方向モードでのバインディングが可能です。残念ながら、V4.5 はまだベータ版なので、コードを変更してアプリを最終的に正しく実行することにしました。

しかし、まだ同様の問題があります。

非常に単純なクラス「RecallConnectionSettings」があります。このクラスのこのメンバーは、コード内のどこからでもアクセスできる必要があるため、(次のように) 静的にすることにしました。

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

ご覧のとおり、変数「サーバー」は 1 つだけです。今私が欲しいのは、TextBox Text-property からその 'Server' 値への 2WayMode バインディングを作成することです。

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

<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 も準備する必要があるため、次のようにしました。

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

この時点では、試行を続ける必要はありません。これを行うには、既定のコンストラクターを public にする必要があるためです。

私が何をしていても、うまくいきません。私はまだそれがどのように機能するのか理解していないようです - 親切にトリックを教えてくれませんか?

4

2 に答える 2

2

シングルトン ソリューションを保持し、これを置き換えます。

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

これで:

...    
<UserControl DataContext="{x:Static local:RecallConnectionSettings.Instance}">
   ...
</UserControl>
...
于 2012-04-18T13:01:13.067 に答える
0

うわー-ニコラスに感謝します、それはうまくいきます!

他の読者のために - テキストボックス用にコーディングする必要があるのは次のとおりです。

<TextBox Text="{Binding Path=Server, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Name="txtServerAdresse"/>
于 2012-04-20T13:50:58.910 に答える