如何绑定到UIElement

本文关键字:UIElement 绑定 何绑定 | 更新日期: 2023-09-27 18:37:19

我正在尝试将父Window传递给命令,以便它可以用于RoutedCommand。有什么办法可以用Dependency Properties做到这一点吗?我看到很多问题说这是不可能的,因为它不是可视化树的一部分,但以下工作:

<Button CommandParameter="{Binding ElementName=Main}" .../>

该参数实际上设置为 Main(父窗口)。那么,如何在带有Dependency Property的自定义对象上执行此操作?

当我尝试在自己的对象 DP 上设置它时出现错误:

System.Windows.Data 错误:2:找不到目标元素的管理框架元素或框架内容元素。绑定表达式:(无路径);数据项=空;目标元素是"命令组"(哈希代码=25702951);目标属性是"命令参数"(类型"对象")

我的班级如下:

public class CommandGroup : DependencyObject, ICommand
{
  public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof (object), typeof (CommandGroup));
  public object CommandParameter
  {
    get { return (object)GetValue(CommandParameterProperty); }
    set { SetValue(CommandParameterProperty, value); }
  }
  ....
}

我想将 XAML 设置为如下:

<Button>
  <Button.Command>
    <CommandGroup CommandParameter={Binding ElementName=Main}>
    ...

如何绑定到UIElement

由于 CommandParameter 不是可视或逻辑树元素,因此它不能继承 DataContext。

。但是当你的对象被Freezable时,它可以继承数据上下文。

public class CommandGroup : Freezable, ICommand
{
    public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof (object), typeof (CommandGroup));
    public object CommandParameter
    {
        get { return (object)GetValue(CommandParameterProperty); }
        set { SetValue(CommandParameterProperty, value); }
    }
    protected override Freezable CreateInstanceCore()
    {
        return new CommandGroup();
    }
}

看:https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/