C# XAML中元素的条件样式

C# XAML中元素的条件样式,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我正在构建一个Windows phone 8应用程序,其视图模型属性为: public bool IsReply {get; set;} 在我的xaml代码中,我想区分两种情况: IsReply=True <Grid Margin="0,0,0,0"> ... </Grid> 基本上,我想根据IsReply的值设置网格元素的样式。我知道在WPF样式中存在触发器,但在WP中显然不存在。 我现在的解决方案是复制整个网格代码,并将每个代码的可见性设置为数据转换器。但是,我

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

public bool IsReply {get; set;}
在我的xaml代码中,我想区分两种情况:

  • IsReply=True

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

    您可以在
    MVVM中绑定
    网格的
    边距

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

    无需创建单独的网格。

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

    xmlns:ei=“clr命名空间:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactivity”
    xmlns:i=“clr命名空间:System.Windows.Interactivity;assembly=System.Windows.Interactivity”
    
    最简单的方法是使用带有触发器的样式:

    <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>
    
    
    
    您应该编写自己的
    ValueConverter
    :。您的转换器应该返回struct实例。谢谢!这很有效。@MarcinJuraszek我知道这很旧,但您介意添加注释作为答案吗?您不应该在视图模型中添加视图代码。更好的方法是使用问题注释中建议的转换器或样式。是的,我试图避免这种情况。对不起,你是对的。我是在WPF的背景下。使用转换器,我已经在WP8中自己完成了这项工作
    if(IsReply)
      margin = new Thickness("0,0,0,0");
    else
      margin = new Thickness("40,0,0,0");
    
    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>
    
    <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>