属性更改未在Visual Studio设计器中显示

时间:2015-12-23 18:26:05

标签: c# wpf xaml properties user-controls

使用VS2015我在一个小应用程序的TextBlock中添加了一些自定义功能,因为我不能从TextBlock本身派生(它是密封的),我来自用户控件。

在我的xaml文件中,我有

<TextBlock x:Name="innerText"/>

作为usercontrol中的唯一元素。

在我的代码隐藏中,我有以下用于访问文本:

public string Label
{
    get { return innerText.Text; }
    set {
        if (value != innerText.Text)
        {
            innerText.Text = value;
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs("Label"));
        }
    }
}

当我运行我的应用时,这非常有用。在其他页面上,我可以添加控件的实例并设置&#34;标签&#34;财产正确。不幸的是,&#34;标签&#34;属性不会传递到设计者自身的内部文本框中。

如何在设计器中获取要更新的值?虽然不是绝对必要的(正如我所说,在运行时它工作正常),它会使设计师的布局更容易。

更新: 我也尝试使用DependencyProperty,同样的问题。运行时效果很好,设计时没有显示任何内容。

public string Label
{
    get { return GetValue(LabelProperty).ToString(); ; }
    set { SetValue(LabelProperty, value); }
}
public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(AutoSizingText), new PropertyMetadata(string.Empty));

然后,在xaml中,我为整个控件设置了DataContext:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

并尝试绑定Text值:

    <TextBlock Text="{Binding Label}" />

1 个答案:

答案 0 :(得分:1)

我建议您使用dependency property,而不是依赖于设置innerText元素的Text属性。依赖项属性的行为与控件上的任何其他属性一样,包括在设计模式下进行更新。

public string Label
{
    get { return (string)GetValue(LabelProperty); }
    set { SetValue(LabelProperty, value); }
}

// Using a DependencyProperty as the backing store for Label.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty LabelProperty =
    DependencyProperty.Register("Label", typeof(string), typeof(MyClassName), new PropertyMetadata(string.Empty));

您的XAML将如下所示:

<UserControl x:Name="usr" ...>
    ...
    <TextBlock Text="{Binding Label, ElementName=usr}" ... />
    ...
</UserControl>

专业提示:输入propdp,然后输入Tab, Tab以快速创建依赖项属性。

以下是一个示例用法:

<local:MyUserControl Label="Le toucan has arrived"/>

注意:使用依赖项属性时,您无需将DataContext设置为Self,这通常会导致UserControl不设置它自己的DataContext,父控件应该。