2

我的一个观点由 5 个组成UserControls,每个显示关于某个对象的数据。例如,假设视图显示了我们公司拥有的奶牛,并且在屏幕上显示了奶牛 1 到 5(每个都在自己的 UserControl 中)。

我想做的(但不确定是否可能)是将牛的状态绑定到其各自的 UserControl 中使用的样式。所以我们有一个属性status,例如ok, hungrydead如果母牛是ok我想显示“正常”样式,如果hungry我希望背景为红色,如果dead我希望文本为黑色并增加字体大小。

我添加了我想要实现的简化版本。不过,我对 WPF 样式/资源字典的了解仍然有限。

我基本上想要的代码
A ViewModel with a Statusproperty

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>
4

1 回答 1

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。

于 2012-08-27T10:17:24.380 回答