ユーザーコントロールをロードするときに、で定義されているスタイルを動的に設定しようとしてい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")));
}
}