我在WPF中有一个用户控件,我希望从使用它的XAML中读取其中一个标签的文本。因此..
我的用户控制:
<UserControl x:Class="muc">
<Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">
<Label.Content>
<Binding ElementName="TestName" Path="." />
</Label.Content>
</Label>
</UserControl>
然后使用它:
<mycontorls:muc TestName="This is a test" />
但它不起作用...... 我怎样才能阅读这些属性?
答案 0 :(得分:8)
我尝试了前两个答案以及我在代码中工作但不在XAML上工作(也不允许您在使用控件时看到设计视图中的更改)。
要让房产像其他任何房产一样工作,这里是完整的过程: (该示例添加了Nullable类型的依赖项属性,以在控件中显示为文本,如果为null则显示默认值)
在代码文件中:
1.a定义依赖属性:
public static readonly DependencyProperty MyNumberProperty = DependencyProperty.Register("MyNumber", typeof(Nullable<int>), typeof(MyUserControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMyNumberChanged)));
1.b实现OnMyNumberChanged回调:
private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){
// When the color changes, set the icon color PlayButton
MyUserControl muc = (MyUserControl)obj;
Nullable<int> value = (Nullable<int>)args.NewValue;
if (value != null)
{
muc.MyNumberTextBlock.Text = value.ToString();
}
else
{
muc.MyNumberTextBlock.Text = "N/A";
}
}
1.c实现MyNumber属性(不依赖)以使用依赖属性以方便代码使用:
public Nullable<int> MyNumber{
get
{
return (Nullable<int>)GetValue(MyNumberProperty);
}
set
{
SetValue(MyNumberProperty, value);
OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value)); // Old value irrelevant.
}
}
在XAML文件中,将TextBlock控件的文本绑定到属性(非依赖项)以获取依赖项属性的默认值,以防它未被控件的用户设置(假设您调用了根元素)用户控件“RootElement”):
此代码:
< TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/>
答案 1 :(得分:4)
如果为root UserControl元素指定名称,则可以使用ElementName:
引用它<UserControl x:Class="muc"
Name="rootElement">
<Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">
<Label.Content>
<Binding ElementName="rootElement" Path="TestName" />
</Label.Content>
</Label>
</UserControl>
您还可以使用标记扩展语法使其缩短:
<UserControl x:Class="muc"
Name="rootElement">
<Label Foreground="#FF7800" FontSize="20" FontWeight="Bold"
Content="{Binding TestName, ElementName=rootElement}"/>
</UserControl>
另请记住,您的控件将在设置其属性之前创建。您将需要实现INotifyPropertyChanged或将TestName
作为依赖项属性,以便在设置属性后重新评估绑定。
答案 2 :(得分:3)
我只使用Silverlight做过这个,但如果它以完全相同的方式工作,我不会感到惊讶!
// <summary>
// Xaml exposed TextExposedInXaml property.
// </summary>
public static readonly DependencyProperty TestNameProperty = DependencyProperty.Register("TestName", typeof(string), typeof(NameOfMyUserControl), new PropertyMetadata(string.empty));
// <summary>
// Gets or sets the control's text
// </summary>
public string TextExposedInXaml
{
get
{
return (string)GetValue(TestNameProperty );
}
set
{
SetValue(TestNameProperty , value);
// set the value of the control's text here...!
}
}
答案 3 :(得分:0)
{Binding ElementName=x}
绑定到元素树中名称为x
的元素,此处没有任何内容可以处理属性TestName
。如果您想在用户控件上使用属性,则必须在与该用户控件对应的类中定义该属性(在您的情况下,它将是muc
),并使用{Binding RelativeSource={RelativeSource FindAncestor, ...}}
来引用它您的用户控件(有关详细信息,请参阅here)或为其命名,以便您可以使用ElementName
。