2

ViewModel の Test というプロパティにコンテンツがバインドされたボタンがあります。

<Button Content="{Binding Test, Mode=TwoWay}"  
            Name="button1"Click="button1_Click" />

ボタンをクリックすると、その内容が変更されます

private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
    button1.Content = "Yellow";
}

しかし、プロパティ セッターでは、設定されているコンテンツをオーバーライドして、独自のコンテンツを設定したいと考えています。以下は同じコードです:

string _test;
public string Test
{
    get
    {
        return _test;
    }
    set
    {
        _test = "Something" + System.DateTime.Now.ToString();
        RaisePropertyChanged(() => Test);
    }
}

問題は、ボタンのコンテンツが「何か...」のようなものではなく、「黄色」に設定されていることです。

このプロパティをテキストボックスと同時にバインドすると、値が正しい方法で表示されます。

注:これは単なる例であり、私の質問の焦点は raisepropertychanged です。

助けてください。

4

3 に答える 3

1

それは本当に奇妙なセッターです。そのようなことをするべきではありません。を設定した場合、完全に異なるものではなく、Test = "Yellow"であると予想されます。Yellowプロパティを更新するコードを別のメソッドに配置し、イベント ハンドラーから を呼び出す必要があります。

string _test;
public string Test
{
    get
    {
        return _test;
    }
    private set
    {
        _test = value;
        RaisePropertyChanged(() => Test);
    }
}

public void UpdateTest()
{
    Test = "Something" + System.DateTime.Now.ToString();
}

private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
    UpdateTest();
}
于 2012-04-08T10:51:59.057 に答える
1

私はあなたの疑いがあります

button1.Content = "Yellow"; 

ViewModel へのバインディングを削除しています。

button1のコンテンツをビューに直接設定するのではなく、ViewModel のコンテンツを設定する必要があります。これにより、それに応じてビューが更新されます。

于 2012-04-09T12:06:35.727 に答える
0

回答ありがとうございます。非デバッグモードで実行すると機能することがわかりました。ただし、Call Back の場合は、非デバッグ モードでも機能しません。

記事http://info.titodotnet.com/2011/08/silverlight-dependency-property-clr.htmlで言及されている解決策をついに手に入れました

乾杯!

于 2012-04-10T05:04:30.853 に答える