【问题标题】:Binding to template-generated child element绑定到模板生成的子元素
【发布时间】:2015-03-26 05:26:30
【问题描述】:

我正在尝试设置一个父控件属性单向绑定,以便它指向用作数据模板的可视树根的控件实例的附加属性:

<DataTemplate DataType="{x:Type myns:HostedObjectType}">
    <myns:ChildControl myns:AttachedBooleanProperty="False">
        <!-- put whatever you like here -->
    </myns:ChildControl>
</DataTemplate>

(...)

<DataTemplate DataType="{x:Type myns:OtherHostedObjectType}">
    <myns:OtherChildControl myns:AttachedBooleanProperty="True">
        <!-- put whatever you like here -->
    </myns:OtherChildControl>
</DataTemplate>

(...)
<myns:ParentControl
    Content="{Binding MyHostedObject}"
    SomeBooleanProperty="{Binding ???}"
/>

什么是绑定到该属性的合适方法不需要在“托管”类上添加任何类型的额外代码

(请注意,上面的例子是故意过分简化的)

【问题讨论】:

  • 如果多个孩子有不同的值怎么办?
  • @RohitVats AFAIK 数据模板只能有一个根元素。
  • 是的,但是如果属性被绑定到像&lt;myns:ChildControl myns:AttachedBooleanProperty="{Binding SomeProperty}"&gt;这样的数据绑定对象,它必然会根据属性的值具有不同的值。
  • SomeBooleanProperty 绑定只是一种方式,因此无论在子属性的附加属性上设置什么绑定,都会自动更新父属性上的属性。我说的对吗?
  • 单路或双路取决于财产登记。一个问题-您可以有多个孩子进行家长控制还是只有一个孩子? (我的孩子是指将创建多少个HostedObjectType 实例?)

标签: .net wpf xaml binding datatemplate


【解决方案1】:

要绑定到 Control 的附加属性,您必须使用 PathElementName 绑定:

<myns:ParentControl
    Content="{Binding MyHostedObject}"
    SomeBooleanProperty="{Binding Path=(myns:AttachedBooleanProperty), Mode=TwoWay, ElementName="childControlName"}"/>

另外我建议反过来:使用TemplatedParent 绑定从ChildControl 获取SomeBooleanProperty

【讨论】:

  • 没有办法简单地获取任何DependencyObject 实例设置为模板的活动可视树根元素,而不管其名称如何?问题是我希望父母和孩子尽可能少地了解彼此。依赖元素名称感觉就像父母会知道太多。使用TemplatedParent 也是如此:我不想要DataTemplate 假设它将托管在ParentControl 中。
  • @Crono,您可以使用特定的转换器来获取 Content 并“解包”它以获取 ChildControl。听起来有点 hacky,但你会得到松耦合。
  • 所以基本上没有简单/干净的方法来拥有它。我希望有某种RelatedSource 魔法可用于获取DataTemplate 的第一个元素,而我只是一直错过它。那好吧。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多