我在WPF中对样式进行数据绑定时遇到问题。
基本设置如下:
<Style x:Key="{x:Type eo:Player}" TargetType="{x:Type eo:Player}">
<Style.Triggers>
<DataTrigger Binding="{Binding Team}" Value="A">
<Setter Property="Template" Value="{StaticResource TeamATemplate}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
该样式应用于Player类型的所有对象。这些对象具有类型为Teams的属性(Enum具有值A,B和C)。取决于玩家在模板中应用于可视化播放器的队伍不同。
现在出现的问题是整个事情在MVVM应用程序中使用,并且不知何故,Player对象的DataContext被设置为最顶层View的ViewModel。我使用了新的诊断选项(TraceLevel)来找出问题所在并得到了这个:
System.Windows.Data Warning: 66 : BindingExpression (hash=30607723): Found data context element: Player (hash=35170261) (OK)
System.Windows.Data Warning: 74 : BindingExpression (hash=30607723): Activate with root item ToolboxViewModel (hash=61398511)
System.Windows.Data Warning: 104 : BindingExpression (hash=30607723): At level 0 - for ToolboxViewModel.Team found accessor <null>
所以基本上找到Player对象作为数据上下文元素(无论这意味着什么),但仍然将ToolboxViewModel用作DataContext。我怎样才能解决这个问题?如何在绑定表达式中引用样式化对象?
答案 0 :(得分:2)
我不知道为什么我之前没有想到这个:
<Style x:Key="{x:Type eo:Player}" TargetType="{x:Type eo:Player}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Team}" Value="A">
<Setter Property="Template" Value="{StaticResource TeamATemplate}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
它与{RelativeSource Self}
完美搭配答案 1 :(得分:-1)
你不能用任何你没有用你的风格设计风格的触发器来设置任何风格。你需要这样做:
<Style x:Key="{x:Type eo:Player}" TargetType="{x:Type eo:Player}">
<Setter Property="Template" Value="{StaticResource TeamBTemplate" />
<Style.Triggers>
<DataTrigger Binding="{Binding Team}" Value="A">
<Setter Property="Template" Value="{StaticResource TeamATemplate}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
看起来你的风格应该在此之后起作用。这些有约束力的警告令人困惑。