UserControl依赖属性设计时间

时间:2013-08-10 03:58:48

标签: c# wpf binding dependency-properties

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

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

还有“Text”依赖属性。

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定义中,没有成功。

2 个答案:

答案 0 :(得分:5)

尝试使用FrameworkPropertyMetadata代替PropertyMetadata,指定下面的AffectsRender,然后重新启动 Visual Studio:

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

MSDN Documentation关于FrameworkPropertyMetadataOptions.AffectsRender

  

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

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

答案 1 :(得分:0)

金铲候选者,还是遇到了同样的问题,并解决了受https://www.codeproject.com/Questions/1096567/How-to-set-a-custom-dependency-property-of-user-co启发的问题

长话短说:您的依赖项属性是在Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper Imports Microsoft.SqlServer.Dts.Runtime.Wrapper <Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _ <CLSCompliant(False)> _ Public Class ScriptMain Inherits UserComponent Dim CampID As String ' This method is called after all the rows have passed through this component. Public Overrides Sub PostExecute() MyBase.PostExecute() Variables.CampaignId = CampID End Sub Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) CampID = Row.CampaignId End Sub End Class 本身上设置的,并且您正在尝试将其子属性绑定到它。孩子的绑定需要定义UserControl,因此RelativeSource应该看起来像这样:

TextBlock

唯一需要的 <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}" /> 分配是您在构造函数中的代码中已经拥有的分配。


更新

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

d:DataContext=...

像魅力一样工作。