首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从DataTemplate访问父DataContext?

如何从DataTemplate访问父DataContext?
EN

Stack Overflow用户
提问于 2018-03-28 05:26:18
回答 2查看 0关注 0票数 0

我有一个ListBox它绑定到ViewModel上的子集合。列表框项基于父视图模型上的属性在数据板中进行样式设置:

代码语言:txt
复制
<Style x:Key="curveSpeedNonConstantParameterCell">
   <Style.Triggers>
      <DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
          ElementName=someParentElementWithReferenceToRootDataContext}" 
          Value="True">
          <Setter Property="Control.Visibility" Value="Hidden"></Setter>
      </DataTrigger>
   </Style.Triggers>
</Style>

我得到以下输出错误:

代码语言:txt
复制
System.Windows.Data Error: 39 : BindingExpression path error: 
 'CurveSpeedMustBeSpecified' property not found on 
   'object' ''BindingListCollectionView' (HashCode=20467555)'. 
 BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified; 
 DataItem='Grid' (Name='nonConstantCurveParametersGrid');
 target element is 'TextBox' (Name=''); 
 target property is 'NoTarget' (type 'Object')

因此,如果我将绑定表达式更改为"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"它可以工作,但前提是父用户控件的数据文本是BindingListCollectionView...。这是不可接受的,因为其余的用户控件绑定到CurrentItemBindingList自动的。

如何在样式中指定绑定表达式,使其工作,而不管父数据上下文是集合视图还是单个项?

EN

回答 2

Stack Overflow用户

发布于 2018-03-28 13:37:35

这里是访问父DataContext的另一种方法通过直接引用知道数据上下文的元素。Binding ElementName并且工作得很好,并且不需要跨组件大量重用模板/样式:

代码语言:txt
复制
<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Content={Binding MyLevel2Property}
              Command={Binding ElementName=level1Lister,
                       Path=DataContext.MyLevel1Command}
              CommandParameter={Binding MyLevel2Property}>
      </Button>
    <DataTemplate>
  <ItemsControl.ItemTemplate>
</ItemsControl>

如果您将按钮放入Style/Template:

代码语言:txt
复制
<Border.Resources>
  <Style x:Key="buttonStyle" TargetType="Button">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="Button">
          <Button Command={Binding ElementName=level1Lister,
                                   Path=DataContext.MyLevel1Command}
                  CommandParameter={Binding MyLevel2Property}>
               <ContentPresenter/>
          </Button>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Border.Resources>

<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Content="{Binding MyLevel2Property}" 
              Style="{StaticResource buttonStyle}"/>
    <DataTemplate>
  <ItemsControl.ItemTemplate>
</ItemsControl>
票数 0
EN

Stack Overflow用户

发布于 2018-03-28 15:16:45

你可以用RelativeSource找到父元素,如下:

代码语言:txt
复制
Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
RelativeSource={RelativeSource AncestorType={x:Type local:YourParentElementType}}}"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档