代码之家  ›  专栏  ›  技术社区  ›  chrischu

带MVVM的WPF数据绑定和样式

  •  2
  • chrischu  · 技术社区  · 15 年前

    我对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的所有对象。这些对象具有类型team的属性(枚举具有值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>
    

    因此,基本上,player对象是作为数据上下文元素(不管这意味着什么),但toolboxviewmodel仍然用作数据上下文。我怎么修这个?如何在绑定表达式中引用样式化对象?

    2 回复  |  直到 15 年前
        1
  •  2
  •   chrischu    15 年前

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

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

    它与相对资源自我完美结合

        2
  •  -1
  •   Anderson Imes    15 年前

    你不能用你还没有设计风格的触发器来设计任何东西。你需要这样做:

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

    看来你的风格应该在这之后起作用。不过,这些绑定警告令人困惑。