Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MVVM的WPF数据绑定和样式_Wpf_Data Binding_Datacontext_Styles - Fatal编程技术网

使用MVVM的WPF数据绑定和样式

使用MVVM的WPF数据绑定和样式,wpf,data-binding,datacontext,styles,Wpf,Data Binding,Datacontext,Styles,我对WPF中的样式进行数据绑定有问题 基本设置如下所示: <Style x:Key="{x:Type eo:Player}" TargetType="{x:Type eo:Player}"> <Style.Triggers> <DataTrigger Binding="{Binding Team}" Value="A"> <Setter Property="Template" Val

我对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应用程序中使用,并且播放器对象的DataContext以某种方式设置为最顶层视图的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>
System.Windows.Data警告:66:BindingExpression(hash=30607723):找到的数据上下文元素:Player(hash=35170261)(确定)
System.Windows.Data警告:74:BindingExpression(哈希=30607723):使用根项ToolboxViewModel(哈希=61398511)激活
System.Windows.Data警告:104:BindingExpression(hash=30607723):处于级别0-对于ToolboxViewModel。团队找到了访问者

因此,基本上玩家对象是作为数据上下文元素(不管这意味着什么)找到的,但ToolboxViewModel仍然用作DataContext。我怎样才能解决这个问题?如何在绑定表达式中引用已设置样式的对象?

您不能使用尚未设置样式的触发器设置任何样式。您需要执行以下操作:

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


看来在这之后你的风格应该行得通。但是,这些绑定警告令人困惑。

我不知道为什么我之前没有想到这一点:

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


它在{relativesourceself}上运行得非常好

问题仍然存在。造成这一切的原因是(至少这是我最好的猜测)DataContext是从父UserControl继承的,因此绑定尝试在UserControl的DataContext(也称为ToolboxViewModel)上查找Team属性。问题是我需要以某种方式引用绑定中的样式化对象。