1

我需要将一些东西绑定到我的 VisualTree 中一个元素的子级。

在用户控件中:

  <StackPanel>
      <DataGrid x:Name="dataGrid" />
      <Control Tag="{Binding ElementName=dataGrid}" />
  </StackPanel>

在 DataGrid 的模板中:

  <Template TargetType=DataGrid>
       ......
       <Control x:Name="FindMe" />
       ......
  </Template>

我想做的是遍历 DataGrid 的 VisualTree,为此我创建了一个自定义标记扩展:

 public class TemplatePartBinding : MarkupExtension
 {
      public override object ProvideValue(IServiceProvider serviceProvider)
      {
        Binding binding = new Binding();
        binding.ElementName = ElementName;

        // HOW DO I GET THE SOURCE OBJECT FROM THE BINDING ?
         DataGrid dataGrid = // Extract the DataGrid from the binding. 

         Control _findMe = VisualTreeHelperExtentions.FindVisualChild<Control>(dataGrid,"FindMe");

         binding.Target = _findMe;
         binding.Path = new PropertyPath("Tag");

       return binding;
      }

      [ConstructorArgument("ElementName")]
      public string ElementName
          {
           get;
           set;
      }

      [ConstructorArgument("TemplatePartName")]
      public string TemplatePartName
      {
           get;
           set;
      } 
  }

在 ProvideValue 中,在将绑定的 ElementName 值命名为 name 之后,我不想找到 DataGrid(绑定的源对象),

如何从刚刚创建的绑定中提取 DependencyObject(我的 DataGrid)?

4

1 回答 1

2

您可以DataGrid在标记扩展提供值方法中获取实例,但FindMe Control将无法使用 VisualTree 扩展方法获取,因为当调用此方法时,当时未创建 dataGrid 的 Visual Tree

此外,逻辑树也不会有任何帮助,因为 Control 是 Visual 子节点,而不是 dataGrid 的逻辑子节点。


但是,对于查找 dataGrid 的问题,您可以像这样:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    IRootObjectProvider provider = (IRootObjectProvider)serviceProvider
                                   .GetService(typeof(IRootObjectProvider));

    DataGrid dataGrid = 
      LogicalTreeHelper.FindLogicalNode((DependencyObject)provider.RootObject,
                                        ElementName) as DataGrid;
    ....
}

IRootObjectProvider会得到你RootObject which will be UserControl,最终可以通过遍历LogicalTree而不是VisualTree来得到你DataGrid,因为它会返回null。(尚未创建视觉树)。

于 2014-02-02T12:41:01.810 回答