9

我正在 WPF 中创建一个简单的用户控件,其中包含一个按钮内的 TextBlock。

<UserControl x:Class="WpfExpansion.MyButton"..... >
    <Grid >
        <Button Background="Transparent" >
            <TextBlock Text="{Binding Path=Text}"/>
        </Button>
    </Grid>
</UserControl>

还有“文本”依赖属性。

public partial class MyButton : UserControl
{
    public MyButton()
    {
        InitializeComponent();
        this.DataContext = this;         
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(MyButton), new PropertyMetadata(string.Empty));

}

然后我像这样使用 UserControl:

<MyButton Text="Test" />

问题是 Visual Studio 的设计没有改变,但它在运行时工作。

怎么了?

我也试过

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

在UC定义里面,没有成功。

4

2 回答 2

6

尝试使用FrameworkPropertyMetadata而不是PropertyMetadata,指定AffectsRender如下,然后重新启动Visual Studio:

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register("Text", typeof(string), typeof(MyButton),
        new FrameworkPropertyMetadata(string.Empty,
            FrameworkPropertyMetadataOptions.AffectsRender));

MSDN 文档关于FrameworkPropertyMetadataOptions.AffectsRender

渲染或布局组合的某些方面(除了测量或排列)受此依赖属性的值更改的影响。

对于其他情况,有 AffectsMeasure、AffectsArrange 等选项。

于 2013-08-10T04:10:04.477 回答
1

金铲子候选人,我仍然遇到了同样的问题,并在https://www.codeproject.com/Questions/1096567/How-to-set-a-custom-dependency-property-of-user-的启发下解决了它合作

长话短说:您的依赖属性是在UserControl自身上设置的,并且您正在尝试将它的子属性绑定到它。孩子的绑定需要已经RelativeSource定义,因此TextBlock应该如下所示:

            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}" />

唯一DataContext需要的赋值是你在构造函数后面的代码中已经拥有的赋值。


更新

但是后来我尝试了您的尝试并得出结论,如果您DataContext已经在 XAML 中定义了,则不需要在每个控件中都提供它。这意味着您需要通过以下方式定义您的 UC(成功d:DataContext=...了):

<UserControl x:Class="WpfExpansion.MyButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:YRS100_Data_Analysis"
             mc:Ignorable="d" 
             d:DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <Button Background="Transparent">
            <TextBlock Text="{Binding Path=Text}" />
        </Button>
    </Grid>
</UserControl>

奇迹般有效。

于 2019-11-21T15:59:56.377 回答