gpt4 book ai didi

c# - 使用 `ElementName` 的 WPF 绑定(bind)失败但在 Path 属性中指定 ElementName 有效吗?

转载 作者:行者123 更新时间:2023-11-30 23:25:19 27 4
gpt4 key购买 nike

我的项目中有这个 xaml:

<UserControl x:Class="MyControl"
... x:Name="Control">

<Grid x:Name="DetailsGrid" > // <-- I set the data object on this in code
<Button x:Name="IconBtn" IsEnabled="{Binding IsEditing, ElementName=Control}"
Style="{DynamicResource ImageButton}" Click="IconBtn_Click" >
...
<Grid>
</UserControl>

我在 MyControl 类中定义了 IsEditing 依赖属性。

namespace MyNamespace
{

public partial class MyControl : UserControl, INotifyPropertyChanged
{
...
public bool IsEditing { get; set; }
....
}
}

以上代码无法启用/禁用 IconBtn 按钮。但以下 which Binds IsEnabled="{Binding Control.IsEditing}" 有效。

<UserControl x:Class="MyControl"
... x:Name="Control">
<Grid x:Name="DetailsGrid" > // <-- I set the data object on this in code
<Button x:Name="IconBtn" IsEnabled="{Binding Control.IsEditing}"
Style="{DynamicResource ImageButton}" Click="IconBtn_Click" >
...
<Grid>
</UserControl>

请告诉我两者的区别

IsEnabled="{Binding IsEditing, ElementName=Control}"

IsEnabled="{Binding Control.IsEditing}" 

我是 WPF 和 C# 的新手。


编辑:但这适用于同一 xaml 的其他部分:

IsReadOnly="{Binding IsEditing ElementName=Control}"

最佳答案

在绑定(bind)表达式中使用 Path 将在 DataContext 中搜索它,而不是在控件属性中。如果要直接绑定(bind)到控件的属性,则必须使用 ElementName 语法指定它。当您编写诸如 {Binding Control.IsEditing} 之类的内容时,WPF 默认情况下会在您的控件的 DataContext 中搜索名为“Control”的属性,但显然找不到。

另一种方法是将 DataContext 设置为控件本身。这可以在构造函数中轻松完成。

编辑

阅读您的评论,如果您正在执行 DataContext = this,那么您的 DataContext 已经设置为控件本身。在这种情况下,您应该简单地使用 {Binding IsEditing},即您不需要指定 ElementName 或限定路径,如 Control.IsEditing。如果您使用 Control. 限定您的路径,WPF 将尝试在控件中找到名为 Control 的属性,但显然不存在。

总而言之,您有 3 个选择:

  1. 指定 x:Name 并使用 {Binding IsEditing, ElementName=XNAME_OF_YOUR_CONTROL} 语法。此选项不需要您在构造函数中设置 DataContext
  2. 不要指定 x:Name,设置 DataContext (DataContext = this;) 并使用语法 {Binding IsEditing}
  3. 通过结合使用 RelativeSource={RelativeSource AncestorType=UserControl}Path=IsEditing 指定源对象。

关于c# - 使用 `ElementName` 的 WPF 绑定(bind)失败但在 Path 属性中指定 ElementName 有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37338062/

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