В то время как все хорошо со стандартным моделированием управления в Silverlight я имею, недавно начал использовать более динамические методы выбирающих данных, которые будут отображены в средствах управления объектами. Одни из средств управления, которые я переделываю, являются набором ссылок.
Проблема, которую я имею, - то, что каждая ссылка окрашена по-другому когда moused. Один красный, один синий, один зеленый цвет, и т.д. Существует ли способ разработать эти объекты, не жертвуя динамикой использования управления объектами с шаблоном данных?
Я сделал это с помощью простого преобразователя свойства модели представления, например, допустим, у вас есть логическое свойство, которым вы хотите управлять стилем, которым вы могли бы это сделать.
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 является логическим свойством модели просмотра, это также сохранит стиль синхронизируется при изменении свойства IsConfirmed
.
Если вы хотите использовать более сложное условие, чем логическое, вы всегда можете создать Словарь объектов для стилей в своем конвертере, а затем заставить конвертер выполнять поиск, но я обнаружил, что обычно логические значения работают в большинстве случаев.