0

私はテキストブロックを持っています

<TextBlock Width="180" Text="{Binding Details, UpdateSourceTrigger=PropertyChanged}"

そしてviewModelで

public string Details
    {
        get
        {
            string strInfo;      
            strInfo = Resources.SharedOn+": " + DateString;

            strInfo += "\n"+Resources.Access+": " + AccessString;

            if (ExpiryString != Resources.ShareExpireNever)
            {
                strInfo += "\n" + Resources.ShareExpire + ": " + ExpiryString;
            }
            if (Note != null && Note != "")
            {
                strInfo += "\n"+Resources.ShareNote+": " + Note;
            }
            return strInfo;
        }
        set
        {
            SetValue(DetailsProperty, value);
        }
    }

TextBlockユーザーが UI で変更を行うたびに、この 3 つの値がすぐに値を反映するように、このプロパティをバインドしたいと考えています。私が追加しました

UpdateSourceTrigger=PropertyChanged

しかし、これは機能していません。それが機能しない理由はありますか?

4

2 に答える 2

0

他のプロパティが依存関係プロパティである場合は、それらの宣言でPropertyMetadataを設定する必要があります。そこで、プロパティの変更されたコールバックを指定できます。ここでDetails、セッターを呼び出してプロパティを更新できます。

public static readonly DependencyProperty NoteProperty = 
    DependencyProperty.Register("Note", typeof (string), 
    typeof (YourObject), new PropertyMetadata(String.Empty, UpdateDetails));

    private static void UpdateDetails(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var o = (YourObject)d;
        o.UpdateDetails();
    }

    private void UpdateDetails()
    {
        string strInfo;
        strInfo = Resources.SharedOn + ": " + DateString;

        strInfo += "\n" + Resources.Access + ": " + AccessString;

        if (ExpiryString != Resources.ShareExpireNever)
        {
            strInfo += "\n" + Resources.ShareExpire + ": " + ExpiryString;
        }
        if (Note != null && Note != "")
        {
            strInfo += "\n" + Resources.ShareNote + ": " + Note;
        }
        Details = strInfo;
    }

他のプロパティが依存関係プロパティでない場合は、単にUpdateDetailsそれらのセッターから呼び出すことができます。

いずれにしても、依存関係プロパティのゲッターとセッターを変更しないでください。つまり、次のようになります。

    public string Details
    {
        get { return (string) GetValue(DetailsProperty); }
        set { SetValue(DetailsProperty, value); }
    }

カスタムコードなしで。

于 2013-10-03T09:44:12.593 に答える
0

私が見る主な問題は、DPを値コンバーターとして使用しようとしているということです

詳細プロパティで連結を行う代わりに、マルチバインディングを使用して GUI で連結します。 http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx

これにより、値コンバーターを設定して、データの変換と反転の両方を行うことができます

于 2013-10-03T10:59:24.163 に答える