我在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定义中,没有成功。
答案 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}" />
分配是您在构造函数中的代码中已经拥有的分配。
DataContext
,则不需要在每个控件中都提供它。这意味着您需要通过以下方式定义您的UC(DataContext
完成了技巧):
d:DataContext=...
像魅力一样工作。