gpt4 book ai didi

.net - 从 DataTemplate 访问父 DataContext

转载 作者:行者123 更新时间:2023-12-02 12:32:34 25 4
gpt4 key购买 nike

我有一个 ListBox,它绑定(bind)到 ViewModel 上的子集合。列表框项目在 DataTemplate 中根据父 ViewModel 上的属性设置样式:

<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>

我收到以下输出错误:

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')

因此,如果我将绑定(bind)表达式更改为 "Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified" 它就可以工作,但前提是父用户控件的 DataContext 是 BindingListCollectionView。这是 Not Acceptable ,因为用户控件的其余部分会自动绑定(bind)到 BindingList 上的 CurrentItem 的属性。

如何在样式内指定绑定(bind)表达式,以便无论父数据上下文是 Collection View 还是单个项目,它都可以正常工作?

最佳答案

我在使用 Silverlight 中的相对源时遇到了问题。经过搜索和阅读后,如果不使用一些额外的绑定(bind)库,我没有找到合适的解决方案。但是,这是另一种获取父 DataContext 访问权限的方法,即直接引用您知道其数据上下文的元素。它使用 Binding ElementName 并且工作得很好,只要您尊重自己的命名并且没有大量重用 templates/styles组件:

<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 中,这也有效:

<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>

起初我认为父元素的 x:Names 无法从模板项中访问,但由于我没有找到更好的解决方案,所以我只是尝试了一下,效果很好。

关于.net - 从 DataTemplate 访问父 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3404707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com