我有一个ListBox绑定到ViewModel上的子集合.列表框项基于父ViewModel上的属性在datatemplate中设置样式:
<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>
Run Code Online (Sandbox Code Playgroud)
我收到以下输出错误:
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')
Run Code Online (Sandbox Code Playgroud)
因此,如果我将绑定表达式更改为"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"它可以工作,但只要父用户控件的datacontext是a BindingListCollectionView.这是不可接受的,因为用户控件的其余部分会自动绑定到CurrentItemon的属性BindingList.
如何在样式中指定绑定表达式,以便无论父数据上下文是集合视图还是单个项目,它都可以工作?
我理解Visual和logical树的概念,但我仍然无法理解这些的真正用途和需要.虽然没有必要知道这些树的一切,但我相信它会在一些高级场景中受益.
我已经阅读了以下文章并理解了这些概念
http://www.codeproject.com/KB/WPF/WpfElementTrees.aspx
http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx
我想要理解的是在框架内使用这些(简单的单词和易于理解的场景)?你究竟何时想出何时使用视觉或逻辑树?有助于可视化这些树的任何其他信息?
有人可以推荐一个很好的教程或视频来解释更高级的 XAML 数据绑定语法吗?我理解并使用我的 View 和 ViewModel 类之间的简单绑定,例如:
Text="{Binding Name}"
Run Code Online (Sandbox Code Playgroud)
但有时我会在其他教程和博客文章中看到这样的绑定,我很难遵循。
ToolTip="{Binding Path=AdornedElement.ToolTip,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Adorner}}}"
Run Code Online (Sandbox Code Playgroud)
通常我可以通过复制到代码来让事情工作,但我真的很想了解发生了什么。