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

本文关键字:显示 属性 Studio Visual | 更新日期: 2023-09-27 18:27:50

使用VS2015,我为一个小型应用程序的TextBlock添加了一些自定义功能,由于我不能从TextBlock本身派生(它是密封的),我从UserControl派生。

在我的xaml文件中,我有

<TextBlock x:Name="innerText"/>

作为用户控件中的唯一元素。

在我的代码背后,我有以下用于访问文本:

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

这在我运行应用程序时非常有效。在其他页面上,我可以添加控件的实例并正确设置"Label"属性。不幸的是,"Label"属性的值没有传递到设计器本身的内部文本框中。

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

更新:我也尝试过使用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}" />

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

我建议使用依赖属性,而不是依赖于设置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,而父控件应该设置。