我正在弄乱WPF并创建用户控件,但是很难理解数据绑定应该如何工作。数据绑定似乎过于复杂,并且只要WPF失效,我认为MS会创建一些快捷方式来避免进行大量的样板代码。
用户控件xaml
<UserControl x:Class="WPFTest.FancyBox"
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"
mc:Ignorable="d">
<DockPanel>
<Label Content="{Binding MyText}"></Label>
</DockPanel>
</UserControl>
用户控件.cs
public partial class FancyBox : UserControl
{
public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register("MyText", typeof(string), typeof(FancyBox), new PropertyMetadata(null));
public string MyText
{
get => (string)GetValue(MyTextProperty);
set => SetValue(MyTextProperty, value);
}
public FancyBox()
{
InitializeComponent();
}
}
在主窗口中的用法
<StackPanel>
<local:FancyBox MyText="testing!"/>
</StackPanel>
答案 0 :(得分:1)
绑定Content="{Binding MyText}"
绑定到控件(Label)的DataContext
,该控件从树的最接近祖先那里继承,该祖先拥有一个(您的代码未显示任何DataContext
作业)
您的预期行为是让Label的内容绑定到User Control的属性,在这种情况下,您需要让用户控制您的源。例如,有很多方法可以做到这一点:
<UserControl x:Class="WPFTest.FancyBox"
x:Name="RootElement"
....
<Label Content="{Binding MyText, Source={x:Reference RootElement} />
或者另一种方式:
<Label Content="{Binding MyText, RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type local:FancyBox}}" />
请记住,没有源(源,RelativeSource)的任何绑定都将来自DataContext
。
答案 1 :(得分:0)
我想我根本不需要数据绑定
我将控件标签更改为:
productid
和我后面的代码:
<Label x:Name="lblText"></Label>