2017-06-08 2 views
0

Ich habe ein Verhalten, wie kann ich es in TextBlock Style verwenden, so dass es auf alle TextBlocks angewendet wird.Benutzt Verhalten in Stil

<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Distance}" > 
     <i:Interaction.Behaviors> 
      <Behaviors:EmptyToNaBehaviour/> 
     </i:Interaction.Behaviors> 
</TextBlock> 

dies ist mein angebracht Verhalten, das ist im Grunde den leeren Wertes N Ändern/A

public class EmptyToNaBehaviour : Behavior<TextBlock> 
{ 
    protected override void OnAttached() 
    { 
     var txtblock = this.AssociatedObject as TextBlock; 

     if (txtblock != null && string.IsNullOrEmpty(txtblock.Text)) 
     { 
      txtblock.Text = "N/A"; 
     } 
    } 
} 

Antwort

1

Es gibt grundsätzlich zwei verschiedene Arten von Verhaltensweisen in WPF, die allgemein als angebracht Verhaltensweisen und Blend-Implementierung Verhaltensweisen.

Ein angeschlossenes Verhalten ist einfach eine Eigenschaft mit einer beigefügten PropertyChangedCallback handler Änderung daran befestigt, der auf eine Aktion durchführt oder verlängert die DependencyObject an dem sie befestigt ist, wenn der Wert der Abhängigkeitseigenschaft ändert.

Normalerweise definieren Sie ein angehängtes Verhalten als statische Klasse mit einer Reihe von statischen Methoden, die den Wert der Abhängigkeitseigenschaft abrufen und festlegen und die gewünschte Logik als Ergebnis des aufgerufenen Callbacks ausführen. Man könnte leicht den Wert solcher Eigenschaften in einer Art gesetzt:

<Setter Property="local:EmptyToNaBehaviour.SomeProperty" Value="x"/> 

eine Mischung Verhalten bietet eine bessere Möglichkeit, die Funktionalität eines Verhaltens der Verkapselung im Vergleich zu einem normalen Verhalten angebracht. Sie sind auch mehr Design-freundlich, da sie leicht an visuelle Elemente in der Benutzeroberfläche per Drag-Drop-Funktion in Blend angebracht werden können. Aber ich fürchte, Sie nicht wirklich eine Mischung Verhalten zu einem Style Setter hinzufügen:

How to add a Blend Behavior in a Style Setter

Also, wenn Sie in der Lage sein, Ihr Verhalten im Rahmen eines Style anwenden, sollten Sie eine angeschlossene Verhalten schreiben statt eines Mischverhaltens.

Bearbeiten: Ihr Verhalten ist ein Blend-Verhalten. Ersetzen Sie ihn durch einen angeschlossenen Verhalten:

public class EmptyToNaBehaviour 
{ 
    public static string GetText(TextBlock textBlock) 
    { 
     return (string)textBlock.GetValue(IsBroughtIntoViewWhenSelectedProperty); 
    } 

    public static void SetText(TextBlock textBlock, string value) 
    { 
     textBlock.SetValue(IsBroughtIntoViewWhenSelectedProperty, value); 
    } 

    public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty = 
     DependencyProperty.RegisterAttached(
     "Text", 
     typeof(string), 
     typeof(EmptyToNaBehaviour), 
     new UIPropertyMetadata(null, OnTextChanged)); 

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     TextBlock txtblock = d as TextBlock; 
     if(txtblock != null) 
      txtblock.Loaded += Txtblock_Loaded; 
    } 

    private static void Txtblock_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBlock txtblock = sender as TextBlock; 
     string text = GetText(txtblock); 
     if (txtblock != null && !string.IsNullOrEmpty(text) && string.IsNullOrEmpty(txtblock.Text)) 
     { 
      txtblock.Text = text; 
     } 
    } 
} 

Verbrauch:

<TextBlock Grid.Row="0" Grid.Column="1" Text="text" 
      Behaviors:EmptyToNaBehaviour.Text="N/A"> 
</TextBlock> 

Oder in einem Stil:

<Style x:Key="style" TargetType="TextBlock"> 
    <Setter Property="Behaviors:EmptyToNaBehaviour.Text" Value="N/A" /> 
</Style> 
+0

Ich habe meine angebracht Verhalten hinzugefügt Frage, die nicht der Fall ist Haben Sie eine Abhängigkeitseigenschaft, könnten Sie in diesem Fall eine Lösung vorschlagen, die in Stil gesetzt wird. – TRS

+0

Das ist ein Mischverhalten und wie erwähnt können Sie ein solches Verhalten nicht auf einen Style anwenden. – mm8

+0

Aber warum benutzt du hier überhaupt ein Verhalten? Sie könnten die gleiche Funktionalität im Stil selbst leicht erreichen. – mm8