【问题标题】:Attached property: Check binding附加属性:检查绑定
【发布时间】:2015-10-29 16:28:17
【问题描述】:

小问题

有没有一种快速的方法可以在运行时知道特定附加属性绑定到什么?

详情

我正在调试一个 UserControl(继承 ItemsControl),它通过样式将其项目的 Canvas.LeftCanvas.Top 绑定到 ViewModel 对象的两个属性。在运行时,我在某个位置放置了一个断点,并想检查Canvas.Left附加属性的绑定。

请注意,我不想查看项目附加属性的当前值。我可以通过在 QuickWatch 或即时窗口中检查 Canvas.GetLeft(myItem) 的值来轻松做到这一点。我想在这里检查实际的绑定,即这个附加属性绑定到myItem的VM属性名称。

我已经尝试过 Snoop,但遗憾的是它没有显示附加属性的绑定(如果我没有遗漏一些明显的东西的话)。

【问题讨论】:

  • Output 窗口将显示任何绑定错误。没有错误可能意味着绑定(如果真的有的话)是成功的。附加属性在值改变时有回调,您可以使用它来调试附加属性绑定。
  • stackoverflow.com/a/2788583/5095281此链接可能会有所帮助
  • @NeverAgain:那篇文章没有讨论附加属性。
  • @Sinatr:我在输出窗口中没有看到任何绑定错误。加上附加属性的值没有改变,所以听回调也无济于事。
  • 加载baml后至少触发一次事件(例如,如果你在xaml中写Canvas.Top="0"你会得到它,如果你不写,那么它显然有默认值),你可以覆盖属性,请参阅here,然后设置回调并查看它为给定项目设置的内容(sender 将是您设置附加属性值的DependencyProperty)。

标签: c# wpf xaml data-binding attached-properties


【解决方案1】:

有没有一种快速的方法可以在运行时知道特定附加属性绑定到什么

是的,只需在某处(在您的窗口中?)覆盖附加属性:

<Window x:Class="WpfApplication1.MainWindow" ... >
    <Grid Canvas.Top="123"/>
</Window>

和代码

public MainWindow()
{
    InitializeComponent();
    Canvas.TopProperty.OverrideMetadata(typeof(MainWindow), new FrameworkPropertyMetadata((d, e) =>
    {
        // you will get here for each Canvas.Top set in MainWindow
        MessageBox.Show(d.ToString());
    }));
}

【讨论】:

    【解决方案2】:

    您可以像获取普通依赖属性绑定一样以编程方式获取附加属性绑定。 IE。从后面的代码中获取名称为myItemsControl的控件的Canvas.LeftProperty附加属性绑定:

    BindingExpression bindingExpression = myItemsControl.GetBindingExpression(Canvas.LeftProperty);
    Binding parentBinding = bindingExpression.ParentBinding;
    

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2011-11-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多