模板的XAML属性路径

时间:2015-08-14 12:24:41

标签: wpf xaml

我的XAML中有以下层次结构:

Grid
  Ruler
  Ruler
  ScrollViewer
    ItemsControl
      ItemsControl.ItemsPanel
        ItemsPanelTemplate
          DrawingCanvas

此处RulerDrawingCanvas是我的UserControls。 DrawingCanvas公开了一个名为MousePosition的属性,我希望两个标尺都绑定到该属性。在阅读PropertyPath Syntax后,我尝试了以下内容:

Chip="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Mode=OneWay, Path=Children[2].(ScrollViewer.Content).(ItemsControl.ItemsPanel).(local:DesignerCanvas.MousePosition).X}"

但这似乎不起作用。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您正在选择子集合中的元素3,它将映射到网格内的第四个元素。您正在寻找Children[2]

答案 1 :(得分:0)

通常在这些情况下,您只需将要绑定的元素命名为。它比在树上找到自己的方式要脆弱得多:

Chip="{Binding MousePosition.X, ElementName=myCanvas}" 

但是,由于您的画布是ItemsControl模板的一部分,因此对于ItemsControl之外的元素,ElementName将不可见。

为了将两者绑定在一起,你需要一些两者都可以看到的中间属性。一种方法是在代码隐藏中为视图声明DependencyProperty。然后,您的Canvas和Rulers都可以使用视图根目录上的ElementName绑定到该属性。

另一种方法是劫持每个元素都有的Tag属性,因此在您的情况下,您可以使用ItemsControl.Tag作为中介:

Chip="{Binding Tag.X, ElementName=myItemsControl}" 

<DrawingCanvas MousePosition={Binding Tag, 
                              ElementName=myItemsControl, 
                              mode=OneWayToSource} />