我的一个观点由 5 个组成UserControls
,每个显示关于某个对象的数据。例如,假设视图显示了我们公司拥有的奶牛,并且在屏幕上显示了奶牛 1 到 5(每个都在自己的 UserControl 中)。
我想做的(但不确定是否可能)是将牛的状态绑定到其各自的 UserControl 中使用的样式。所以我们有一个属性status
,例如ok
, hungry
。dead
如果母牛是ok
我想显示“正常”样式,如果hungry
我希望背景为红色,如果dead
我希望文本为黑色并增加字体大小。
我添加了我想要实现的简化版本。不过,我对 WPF 样式/资源字典的了解仍然有限。
我基本上想要的代码
A ViewModel with a Status
property
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>