XAML中元素的条件样式

时间:2013-11-26 02:17:05

标签: c# xaml windows-phone-8

我正在构建一个Windows Phone 8应用,其视图模型属性为:

public bool IsReply {get; set;}

在我的xaml代码中,我想区分两种情况:

  1. IsReply=True

    <Grid Margin="0,0,0,0">
    ...
    </Grid>
    
  2. IsReply=False

    <Grid Margin="40,0,0,0">
    ...
    </Grid>
    
  3. 基本上,我想根据IsReply的值设置Grid元素的样式。我知道在WPF Style.Triggers存在,但显然不在WP中。 我现在的解决方案是拥有整个网格代码的副本,并将每个网格代码的可见性设置为数据转换器。但是,我觉得这应该更简单。

3 个答案:

答案 0 :(得分:6)

最简单的方法是使用带触发器的样式:

<Grid>
    <Grid.Style>
        <Style TargetType="Grid">
            <Setter Property="Margin" Value="40 0 0 0"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsReply}" Value="True">
                    <Setter Property="Margin" Value="0 0 0 0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>
</Grid>

答案 1 :(得分:0)

您可以绑定margin

grid的{​​{1}}
MVVM

在你的模特中

<Grid Margin="{Binding margin}">
 ...
</Grid>

无需创建单独的网格。

答案 2 :(得分:0)

您可以使用DataTrigger,但必须添加这两个引用(右键单击项目中的References和AddReference / Assemblies / Extensions / ...)。

xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

<Grid
    Margin="0">

    <i:Interaction.Triggers>

        <ei:DataTrigger
            Binding="{Binding Path=IsReply}"
            Value="True">

            <ei:ChangePropertyAction
                PropertyName="Margin"
                Value="0" />

        </ei:DataTrigger>

        <ei:DataTrigger
            Binding="{Binding Path=IsReply}"
            Value="False">

            <ei:ChangePropertyAction
                PropertyName="Margin"
                Value="40,0,0,0" />

        </ei:DataTrigger>

    </i:Interaction.Triggers>

</Grid>