我在StandardStyles中添加了一个样式。Xaml的定义如下:
<TextBlock Name="txtStatus" Text="{Binding Status}"
Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis"/>
显示的文本将取决于绑定数据源的Status属性。我想在结束语前加上"Status:",这样结束语就像这样:" Status: Complete"。
我还想根据状态有一个条件颜色。在上面的例子中,我希望Completed是绿色的(状态字仍然是正常的颜色)。
我该怎么做呢?
对于条件样式,您必须使用数据绑定转换器。首先创建如下所示的新类。
public class StatusToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var _status = value.ToString();
if (_status == "To Do")
return new SolidColorBrush(Windows.UI.Colors.Red);
else if (_status == "In Progress")
return new SolidColorBrush(Windows.UI.Colors.Yellow);
else if (_status == "Completed")
return new SolidColorBrush(Windows.UI.Colors.Green);
else
return new SolidColorBrush(Windows.UI.Colors.White);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
现在,当你想使用,添加它作为页面的资源,像这样
<Page.Resources>
<local:StatusToColorConverter x:Key="StatusToColor"/>
</Page.Resources>
然后你必须使用TextBlock
的前景属性中的转换器它是由Status
约束的。它会根据Status
返回合适的颜色。
您可以使用<Run />
将文本与绑定文本合并。
<TextBlock Name="txtStatus" Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis">
<Run Text="Status :" /> <Run Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToColor}}"/>
</TextBlock>
你也可以添加一个新的属性(StateColor)到你的DataContext,包装你的文本块在一个边界控件和绑定这个边界的背景属性(简单,但可能对MVVM,因为你得到一些UI的东西到你的视图模型)。
另一种实现目标的方法是使用一个样式选择器,参见:http://zamjad.wordpress.com/2010/01/01/applying-style-conditionally/http://blogs.u2u.be/diederik/post/2012/05/22/Using-Dynamic-XAML-in-Windows-8-Metro.aspx
欢呼,亚历克斯