为什么我的UserControl绑定不工作

本文关键字:工作 绑定 UserControl 我的 为什么 | 更新日期: 2023-09-27 18:05:35

我认为这将是相当简单的做法,但似乎我一定错过了一些盲目的明显

问题是,我传递值给我的UserControl (BoxPanel),但值不显示。

显示无文字的蓝色框。

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <l:BoxPanel Number="1" Text="Hi" />
    </Grid>
</Window>

BoxPanel.xaml

<UserControl x:Class="WpfApplication1.BoxPanel"
         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" 
         Height="50" Width="90">
<Border Background="Blue">
    <StackPanel>
        <TextBlock FontSize="20" HorizontalAlignment="Center" 
            Text="{Binding Number}" />
        <Label FontSize="10" HorizontalAlignment="Center" Foreground="White" 
            Content="{Binding Text}" />
    </StackPanel>
</Border>

BoxPanel.xaml.xs

public partial class BoxPanel : UserControl
{
    public static readonly DependencyProperty NumberProperty = 
        DependencyProperty.Register("Number", typeof(decimal), typeof(BoxPanel));
    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register("Text", typeof(string), typeof(BoxPanel));
    public BoxPanel()
    {
        InitializeComponent();
    }
    public decimal Number
    {
        get { return (decimal)GetValue(NumberProperty); }
        set { SetValue(NumberProperty, value); }
    }
    public string Text
    {
        get { return (string)base.GetValue(TextProperty); }
        set { base.SetValue(TextProperty, value); }
    }
}

为什么我的UserControl绑定不工作

默认情况下,绑定路径以DataContext为根。但是您希望绑定到UserControl上定义的属性。所以你必须以某种方式重定向它们。我通常用ElementName

<UserControl x:Class="WpfApplication1.BoxPanel"
         x:Name="BoxPanelRoot"
         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" 
         Height="50" Width="90">
<Border Background="Blue">
    <StackPanel>
        <TextBlock Text="{Binding Number, ElementName=BoxPanelRoot}" />
        <Label Content="{Binding Text, ElementName=BoxPanelRoot}" />
    </StackPanel>
</Border>

一开始看起来有点奇怪,并且像这样重定向绑定有点烦人,但它比在UserControl中利用DataContext的其他方法更可取。如果您通过将DataContext设置为UserControl的根来阻止它,那么您就有效地阻止了将数据传递到UserControl的最佳方法。

经验法则,在UserControl中绑定时,不要使用DataContext,除非你显式地绑定传递给UserControl 的数据