首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用ElementName从绑定中获取绑定源对象

使用ElementName从绑定中获取绑定源对象
EN

Stack Overflow用户
提问于 2014-02-02 02:56:27
回答 1查看 746关注 0票数 1

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

在UserControl中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <StackPanel>
      <DataGrid x:Name="dataGrid" />
      <Control Tag="{Binding ElementName=dataGrid}" />
  </StackPanel>

在DataGrid的模板中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <Template TargetType=DataGrid>
       ......
       <Control x:Name="FindMe" />
       ......
  </Template>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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值(它的名称)之后,我不会定位DataGrid (绑定的源对象),

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-02 04:41:01

您可以在标记扩展中获取DataGrid实例,提供值方法,但是您将无法使用VisualTree扩展方法获得DataGrid实例,因为当调用该方法时,没有创建用于dataGrid的VisualTree。

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

但是,要想找到dataGrid,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。(尚未创建可视树)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21509716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文