将属性绑定到视图的style / resourcedictionary

时间:2012-08-27 09:48:57

标签: c# wpf caliburn.micro

我的一个视图由5个UserControls组成,每个视图显示有关某个对象的数据。比如说,视图显示我们公司的奶牛,并在屏幕上显示奶牛1到5(每个都在他们自己的UserControl中)。

我想做什么(但不确定是否可行)是将牛的状态绑定到其各自UserControl中使用的样式。我们有一个属性status,例如okhungrydead。如果母牛是ok我想要显示'正常'样式,如果它是hungry我希望背景为红色,如果它是dead我希望文字是黑色的fontsize增加了。

我添加了我想要实现的简化版本。我对WPF样式/资源词典的了解仍然有些限制。

我基本上想要的代码
具有Status属性

的ViewModel
class CowInfoViewModel : Screen
{
    public string Name { get; set; }

    public string Status { get; set; } //"ok", "hungry", "dead"
}

检索样式或资源字典的视图

<UserControl x:Class="WpfModifyDifferentView.Views.CowInfoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- A reference to a ResourceDictionary with styles, that is bound to the 'Status' property -->

    <StackPanel>
        <TextBlock x:Name="Name" Text="Cow Name"/>
        <TextBlock x:Name="Status" Text="Ok" />
    </StackPanel>
</UserControl>

编辑 - 解决方案:

我使用Vale的答案做了以下事情:

在xaml中(对转换器的引用):

    <UserControl.Resources>
        <Converters:CowStyleConverter x:Key="styleConverter" />
    </UserControl.Resources>

在xaml(元素)中:

        <TextBlock x:Name="Name" Text="Cow Name" Style="{Binding Path=Style, ConverterParameter='TextBlockCowName', Converter={StaticResource styleConverter}}" />

转换器(注意我省略了支票):

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var status = value.ToString();
        var styleName = parameter.ToString();

        _resourceDictionary.Source = new System.Uri(string.Format("pack://application:,,,/Resources/ScreenI2Style{0}.xaml", status));

        return _resourceDictionary[styleName];
    }

然后我创建了多个具有以下样式的ResourceDictionaries:

<Style x:Key="TextBlockCowName" TargetType="TextBlock">
    <Setter Property="Foreground" Value="{StaticResource SomeBrush}" />
</Style>

1 个答案:

答案 0 :(得分:1)

您可以将UserControl Style属性绑定到Status并使用转换器。

<UserControl x:Class="WpfModifyDifferentView.Views.CowInfoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:local="clr-namespace:WpfModifyDifferentView"
             Style="{Binding Path=Status, Converter={StaticResource myConverter}}">
        <UserControl.Resources>
            <local:MyConverter x:Key="myConverter" />
        </UserControl.Resources>

我假设你的转换器直接在WpfModifyDifferentView中。 转换器将如下所示:

public class MyConverter : IValueConverter {
        private ResourceDictionary dictionary;

        public MyConverter() {
            if (dictionary == null) {
                dictionary = new ResourceDictionary();
                dictionary.Source = new Uri("pack://application:,,,/WpfModifyDifferentView;Component/Resources/Styles.xaml");
            }
        }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            switch (value.ToString()) {
                case "ok":
                    return dictionary["myKeyForOkStyle"] as Style;
                case "hungry":
                    return dictionary["myKeyForHungryStyle"] as Style;
                case "dead":
                    return dictionary["myKeyForDeadStyle"] as Style;
                default:
                    return null;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            throw new NotImplementedException();
        }
    }

当然,您需要指定正确的URI。