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