使用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}" />
答案 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
,父控件应该。