Windows商店应用程序 - 条件样式

时间:2013-06-02 16:18:12

标签: styles windows-store-apps winrt-xaml xaml-binding

我在StandardStyles.xaml中添加了一个样式,其定义如下:

        <TextBlock Name="txtStatus" Text="{Binding Status}" 
               Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis"/>

然后,显示的文本将取决于绑定数据源上的Status属性。我想在之前加入“状态:”这个词,这样决赛就像这样:“状态:完成”。

我还希望根据状态设置条件颜色。在上面的例子中,我希望Completed为绿色(状态字仍然是正常颜色)。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

对于条件样式,您必须使用数据绑定转换器。首先创建一个新类,如下所示。

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>

答案 1 :(得分:0)

您还可以向DataContext添加一个新属性(StateColor),将文本块包装在Border控件中并将此边框的背景绑定到属性(简单但可能针对MVVM,因为您在viewmodel中获得了一些UI内容)。

实现目标的另一种方法是使用StyleSelector,请参阅: 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

欢呼,亚历克斯