【发布时间】:2012-08-21 18:20:04
【问题描述】:
我正在尝试在加载用户控件时动态设置在App.xaml 中定义的样式,并且由于某种原因它没有应用该样式(即没有发生错误,只是没有应用该样式)。
我确定这是因为我定义了错误的绑定,但我无法弄清楚我需要做些什么不同的事情才能让它工作。
App.xaml 样式
我追求的样式是RunningTitleBlock,它由我在下面的代码示例中包含的其他几个样式组成。
<Style TargetType="Label">
<Setter Property="Margin" Value="4"/>
</Style>
<Style TargetType="Label"
BasedOn="{StaticResource {x:Type Label}}"
x:Key="HeaderBlock">
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White"/>
</Style>
<Style TargetType="Label"
BasedOn="{StaticResource ResourceKey=HeaderBlock}"
x:Key="TitleBlock">
<Setter Property="Foreground" Value="Black"/>
</Style>
<Style TargetType="Label"
BasedOn="{StaticResource ResourceKey=TitleBlock}"
x:Key="RunningTitleBlock">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.0, 0.5"
EndPoint="1.0, 0.5">
<GradientStop Color="White" Offset="0.0"/>
<GradientStop Color="Green" Offset="1.0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
用户控件上的绑定
我正在尝试让Binding 绑定到从值转换器返回的值。
Style="{DynamicResource ResourceKey={Binding Path=MonitoringType, Converter={StaticResource TSConverter}}}"
代码
MonitoringTypes 枚举
public enum MonitoringTypes
{
Running,
Failed,
Paused,
Favorites,
}
用户控制
这里我要做的是将传入的MonitoringTypes 枚举值的字符串值与一些众所周知的文本连接起来,以构建存在于App.xaml 中的样式名称。值转换器被调用并且返回正确的值,但由于某种原因,样式不适用。
/// <summary>
/// Interaction logic for MonitorWorkflow.xaml
/// </summary>
public partial class MonitorWorkflow : UserControl
{
public MonitorWorkflow(MonitoringTypes monitoringType)
{
InitializeComponent();
this.DataContext = new MonitorWorkflowViewModel { MonitoringType = monitoringType };
}
}
public class MonitorWorkflowViewModel
{
public MonitoringTypes MonitoringType { get; set; }
}
public class TitleStyleValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var type = (MonitoringTypes)value;
return string.Format("{0}TitleBlock", Enum.GetName(typeof(MonitoringTypes), type));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0, value.ToString().IndexOf("TitleBlock")));
}
}
【问题讨论】:
-
我可能只使用 IValueConverter 并返回样式。
-
您绑定的属性必须是依赖属性,或者您需要实现 INotifyPropertyChanged 以在值更新时通知绑定。在您的情况下,您需要在枚举值更改时通知您的“TitleBlockStyle”属性已更改(将其包装在属性中)。您最好使用 ValueConverter 并将其绑定到您的枚举,如下例所示:stackoverflow.com/questions/5082509/…
-
@patrickinmpls,我已经更新了我的问题以显示我尝试在哪里使用值转换器。
-
@Moozhe,我已经更新了我的问题以显示我尝试在哪里使用值转换器。
-
@code4life,所以你想看看如果我不尝试继承,是否只有
Background被应用?
标签: wpf custom-controls