C# XAML中元素的条件样式
我正在构建一个Windows phone 8应用程序,其视图模型属性为: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中显然不存在。 我现在的解决方案是复制整个网格代码,并将每个代码的可见性设置为数据转换器。但是,我
public bool IsReply {get; set;}
在我的xaml代码中,我想区分两种情况:
IsReply=True
<Grid Margin="0,0,0,0">
...
</Grid>
我现在的解决方案是复制整个网格代码,并将每个代码的可见性设置为数据转换器。但是,我觉得这应该更简单。您可以在
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>