私はSilverlightの標準的なコントロールのスタイル設定に問題はありませんが、最近、アイテムコントロールに表示されるデータをフェッチするより動的な方法を使用し始めました。私が作り直しているコントロールの1つは、リンクのコレクションです。
私が抱えている問題は、マウスを合わせると各リンクの色が異なることです。1つの赤、1つの青、1つの緑など。データテンプレートでアイテムコントロールを使用するダイナミクスを犠牲にすることなく、これらのアイテムのスタイルを設定する方法はありますか?
私はSilverlightの標準的なコントロールのスタイル設定に問題はありませんが、最近、アイテムコントロールに表示されるデータをフェッチするより動的な方法を使用し始めました。私が作り直しているコントロールの1つは、リンクのコレクションです。
私が抱えている問題は、マウスを合わせると各リンクの色が異なることです。1つの赤、1つの青、1つの緑など。データテンプレートでアイテムコントロールを使用するダイナミクスを犠牲にすることなく、これらのアイテムのスタイルを設定する方法はありますか?
これは、ビューモデルのプロパティで単純なコンバーターを使用して行いました。たとえば、これを実行できるスタイルを制御したいブールプロパティがあるとします。
public class BoolToStyleConverter : IValueConverter
{
public Style TrueStyle{ get; set; }
public Style FalseStyle{ get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((bool)value) ? TrueStyle : FalseStyle;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
次に、リソースとして、2つのスタイルを定義します...
<common:BoolToStyleConverter x:Key="BoldTextConverter">
<common:BoolToStyleConverter.TrueStyle>
<Style TargetType="TextBlock">
<Setter Property="FontWeight"
Value="Bold"></Setter>
</Style>
</common:BoolToStyleConverter.TrueStyle>
<common:BoolToStyleConverter.FalseStyle>
<Style TargetType="TextBlock">
<Setter Property="FontWeight"
Value="Normal"></Setter>
</Style>
</common:BoolToStyleConverter.FalseStyle>
</common:BoolToStyleConverter>
次に、このようにオブジェクトに適用します...
<TextBlock Text="{Binding Description}"
Margin="20,4,4,4"
Style="{Binding IsConfirmed, Converter={StaticResource BoldTextConverter}}"></TextBlock>
IsConfirmedがビューモデルのブールプロパティである場合、これにより、IsConfirmed
プロパティが変更された場合でもスタイルの同期が維持されます。
ブール値よりも複雑な条件を使用する場合は、コンバーターで常にオブジェクトのディクショナリをスタイルに作成してから、コンバーターにルックアップを実行させることができますが、通常、ブール値がほとんどの場合に機能することがわかりました。