Ответ 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
}
то в качестве ресурса вы определяете свои два стиля...
<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 является логическим свойством в viewmodel, это также сохранит стиль в синхронизации, если свойство IsConfirmed
изменится.
Если вы хотите использовать более сложное условие, чем логическое, вы всегда можете создать словарь объектов для стилей в вашем конвертере, а затем сделать конвертер для поиска, но я обнаружил, что обычно в большинстве случаев работают boolean.