2011-01-02 2 views
2

Wie kann ich einen Trigger für ein Silverlight-Datagrid erstellen, in dem sich die Hintergrundfarbe der Zelle basierend auf dem Zellenwert ändert? Ich habe vor einiger Zeit an einem WPF-Projekt gearbeitet und ich erinnere mich, dass dies über DataTriggers im XAML recht einfach war. Allerdings scheint diese Funktionalität in Silverlight nicht verfügbar zu sein, und ich stehe fest, wo ich anfangen soll.Wie erstellt man einen WPF-ähnlichen Datentrigger in Silverlight?

Vielen Dank.

Antwort

2

Erstens ist der VisualStateManager der Ersatz für Trigger in Silverlight. Der VSM ist tatsächlich viel mächtiger als Trigger, da er es ermöglicht, ein StoryBoard auszuführen, wenn sich der Status ändert.

Wenn Sie in Ihrer Situation keine Animation benötigen, würde ich einen IValueConverter verwenden. Erstellen Sie im DataTemplate einen Rahmen, und binden Sie den Hintergrundpinsel an die Eigenschaft Ihres DataItems, die Sie zum Ändern des Hintergrundpinsels verwenden möchten.

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(); 
    } 
} 

Dann würde Ihre XAML wie folgt aussehen:

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

Wenn Sie Animation benötigen, dann auf dem Visual lesen wollen Sie gehen. Im Wesentlichen erstellen Sie ein Template oder ein UserControl mit einer Abhängigkeitseigenschaft. Wenn diese Eigenschaft sich ändert, bestimmen Sie, in welchem ​​Status sich das Steuerelement befinden soll, und rufen den visuellen Statusmanager auf. Die Syntax ist so etwas wie

VisualStateManager.GoToVisualState(yourControlInstance,"TheState",boolUseTransitions); 
+0

+1 Nahe genug zu verwenden. Sie müssen sicherstellen, dass der Wert null ist. Auch sein GoToState nicht GoToVisualState. – AnthonyWJones

0

Dies ist ein Beispiel ist wahr und falsch Pinsel

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));} 

und in 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}" />