如何在运行时将textBlock文本绑定到某个字符串属性

时间:2013-10-03 09:31:04

标签: c# wpf xaml

我有一个textBlock

<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);
        }
    }

我希望以这样的方式绑定此属性:每当用户在UI中进行任何更改时,此TextBlock这三个值会立即反映这些值。我添加了

UpdateSourceTrigger=PropertyChanged

但这不起作用。 任何想法为什么它不起作用?

2 个答案:

答案 0 :(得分:0)

如果您的其他属性是依赖项属性,则应在其声明中设置PropertyMetadata。在那里,您可以指定属性更改的回调,您可以通过调用其setter来更新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即可。

无论哪种方式,您都不应该修改依赖项属性的getter和setter。意思是,它们看起来像:

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

没有任何自定义代码。

答案 1 :(得分:0)

我看到的主要问题是您尝试使用DP作为值转换器

不是在details属性中进行连接,而是使用多重绑定在GUI中进行,http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx

这将允许您将值转换器设置为转换和反转数据