WPF:如何在自定义控件中显示文本?

时间:2014-10-22 10:01:58

标签: c# wpf

我有一个自定义按钮MyButton,其Text属性定义如下:

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof(string), typeof(MyButton));

public string Text
{
    get { return GetValue(TextProperty) as string; }
    set { SetValue(TextProperty, value); }
}

Text的{​​{1}}属性绑定到对象的属性:

MyButton

我希望绑定的文字显示在<local:MyButton Text="{Binding Path=SomeString}"/> TextBlock内,如何完成此操作?

这是我的第一次不良尝试,修改了setter

MyButton

但后来在wpftutorial.net/DependencyProperties.html

上看到了这个
  

不要向这些属性添加任何逻辑,因为它们仅被调用   从代码中设置属性时。如果您从XAML设置属性   直接调用SetValue()方法。

感谢任何帮助!


下面的

更新:set { SetValue(TextProperty, value); aTextBlock.Text = value.ToString(); //this is bad, from what i read }

的xaml
MyButton

如图所示,我尝试绑定<UserControl ...> <Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" > <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Viewbox Stretch="Uniform" Grid.Column="0"> <TextBlock x:Name="aTextBlock" Text="{Binding Path=Text}"/> </Viewbox> <Viewbox Grid.Column="1"> <TextBlock Text="someText" /> </Viewbox> </Grid> </Button> </UserControl> 的{​​{1}},但该文字从未显示过;只有&#34; someText&#34;从第1列显示。

按照@Krishna

的建议这样做
Text

不会使用错误

进行编译
aTextBlock

抱歉,我知道这应该很简单,但还不能让它发挥作用。我没有使用模板进行此控件。谢谢!

2 个答案:

答案 0 :(得分:1)

如果Text属于UserControl,则您需要更改绑定来源,否则会在当前Text中查找DataContext。您可以通过RelativeSource

执行此操作
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}"/>

或者给UserControl一些名字

<UserControl ... x:Name="myUserControl">

然后在绑定中使用ElementName

<TextBlock Text="{Binding ElementName=myUserControl, Path=Text}"/>

答案 1 :(得分:0)

这可能不是正确的方法,但它现在有效。 Text的{​​{1}}通过回调方式更改(从此page中学习)

在我的用户控件后面的代码中:

TextBlock