Как создать WPF-подобный триггер данных в Silverlight? - PullRequest
2 голосов
/ 02 января 2011

Как создать триггер для сетки данных Silverlight, в которой цвет фона ячейки изменяется в зависимости от значения ячейки? Я работал над проектом WPF некоторое время назад, и я помню, что это было довольно просто через DataTriggers в xaml. Однако эта функция недоступна в Silverlight, и я не могу понять, с чего начать.

Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Во-первых, заменой триггеров в Silverlight является VisualStateManager.VSM на самом деле намного более мощный, чем триггеры, так как он позволяет вам выполнять StoryBoard при изменении состояния.

Если вам не нужна анимация в вашей ситуации, я бы решил, что для ее решения будет использоватьсяIValueConverter.Создайте границу в DataTemplate и привяжите фоновую кисть к свойству DataItem, которое вы хотите использовать для изменения фоновой кисти.

    public class BrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
       value.ToString() == "Red" ? new SolidColorBrush(Color.Red) : SolidColorBrush(Color.Blue);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedExcpetion();
    }
}

Затем ваш XAML будет выглядеть примерно так:

<Border Background={Binding InterestingProperty,Converter={StaticResource BrushConverter}} />

Если вам действительно нужна анимация, то вы захотите прочитать в VisualStateManager.По сути, вы должны создать Templated или UserControl со свойством зависимости, а затем при изменении этого свойства определить, в каком состоянии должен находиться элемент управления, и вызвать диспетчер визуальных состояний.Синтаксис что-то вроде

VisualStateManager.GoToVisualState(yourControlInstance,"TheState",boolUseTransitions);
0 голосов
/ 05 декабря 2011

Это пример использования true и false Brush

 public class BoolToBrushConverter:DependencyObject,IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if(value is bool && (bool)value)
      {
        return TrueBrush;
      }

  return FalseBrush;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
  throw new NotImplementedException();
}



public Brush FalseBrush
{
  get { return (Brush)GetValue(FalseBrushProperty); }
  set { SetValue(FalseBrushProperty, value); }
}

// Using a DependencyProperty as the backing store for FalseBrush.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty FalseBrushProperty =
    DependencyProperty.Register("FalseBrush", typeof(Brush), typeof(BoolToBrushConverter), new PropertyMetadata(null));



public Brush TrueBrush
{
  get { return (Brush)GetValue(TrueBrushProperty); }
  set { SetValue(TrueBrushProperty, value); }
}

// Using a DependencyProperty as the backing store for TrueBrush.  This enables animation, styling, binding, etc...

public static readonly DependencyProperty TrueBrushProperty =
    DependencyProperty.Register("TrueBrush", typeof(Brush), typeof(BoolToBrushConverter), new PropertyMetadata(null));}

и в XAML

<UserControl.Resources>
    <converter:BoolToBrushConverter x:Key="enabledToBrushConverter"
               TrueBrush="White" FalseBrush="Gray" />
</UserControl.Resources> 

<TextBlock  Foreground="{Binding Element.IsEnabled,
  Converter={StaticResource enabledToBrushConverter}, ElementName= your_Element}"  />
...