gpt4 book ai didi

c# - WPF 将绑定(bind)传递到我的用户控件

转载 作者:行者123 更新时间:2023-11-30 14:53:10 24 4
gpt4 key购买 nike

我创建了一个简单的 UserControl,它有一个 Value 属性:

public partial class Label : UserControl
{
public Label()
{
InitializeComponent();
DataContext = this;
}

public object Value
{
get { return GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(Label), new PropertyMetadata(""));
}

我正在使用这个 XAML:

<Border BorderBrush="#A0A0A0" BorderThickness="1, 1, 0, 0" CornerRadius="1">
<Border BorderBrush="#000000" BorderThickness="0, 0, 1, 1" CornerRadius="1">
<Border.Background>
<LinearGradientBrush StartPoint="0.5, 0" EndPoint="0.5, 1">
<GradientStop Color="#FFFFFF" Offset="0.0" />
<GradientStop Color="#E0E0E0" Offset="1.0" />
</LinearGradientBrush>
</Border.Background>
<TextBlock Width="100" FontWeight="SemiBold" Padding="2" Text="{Binding Value}" />
</Border>
</Border>

当我像这样显式设置值时,这会起作用:

<uc:Label Value="Name" />

但由于某种原因,当我尝试使用绑定(bind)时它没有:

<ItemsControl ItemsSource="{Binding InfoDetran}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- Doesn't work -->
<uc:Label Value="{Binding Label}" />
<!-- But this works -->
<TextBox Text="{Binding Label}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

我的 userControl 的 Value 属性未更新,我收到绑定(bind)错误:BindingExpression 路径错误:在“object”“Label”上找不到“Label”属性(名称='')'。绑定(bind)表达式:路径=标签; DataItem='标签'(名称='');目标元素是 'Label' (Name='');目标属性是“值”(类型“对象”)

它正在寻找属性的对象是什么,我做错了什么?

最佳答案

DataContext 是从父级继承的,它消除了您的手动 setter 。

您可以通过更改 XAML 将内容的 DataContext 绑定(bind)到控件本身的内容来解决此问题,然后绑定(bind)将继续工作,因为继承的上下文始终是 UserControl本身:

<UserControl ...
x:Name="Root">
<Border DataContext="{Binding ElementName=Root}" BorderBrush="#A0A0A0" BorderThickness="1, 1, 0, 0" CornerRadius="1">
<Border BorderBrush="#000000" BorderThickness="0, 0, 1, 1" CornerRadius="1">
<Border.Background>
<LinearGradientBrush StartPoint="0.5, 0" EndPoint="0.5, 1">
<GradientStop Color="#FFFFFF" Offset="0.0" />
<GradientStop Color="#E0E0E0" Offset="1.0" />
</LinearGradientBrush>
</Border.Background>
<TextBlock Width="100" FontWeight="SemiBold" Padding="2" Text="{Binding Value}" />
</Border>
</Border>
</UserControl>

请注意,我已将控件命名为 x:Name="Root" 并将 Border 上下文绑定(bind)为 DataContext="{Binding ElementName=Root} ".

您可以从后面的代码中删除 DataContext = this

关于c# - WPF 将绑定(bind)传递到我的用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com