Behavior ein und ausschalten



  • Ist es möglich ein bestehendes Behavior ein und aus zu schalten über ein Property oder ein Hilfskonstrukt?



  • Oh das ist vieleicht wichtig: es ist ein WPF Projekt. 🙂



  • Noch etwas genauer.

    Ich habe in einem UserControl eine Textbox. In Dieser Textbox soll es in Abhängigkeit einer Property nur möglich sein Zahlen einzugeben.

    Dass nur Zahlen eingegeben werden können habe ich über eine Behavior gelöst.
    Dies soll aber nur angewendet werden wenn die Property IsNumeric gesetzt ist.

    Verwendung

    <MyUserControl IsNumeric=True>
    

    UserControl

    ...
    <TextBox>
        <!-- nur wenn IsNumeric == true-->
        <i:Interaction.Behaviors>
           <behaviors:NumericTextBox />
       </i:Interaction.Behaviors>
    </TextBox>
    


  • Hallo.

    Da noch keiner eine Lösung hatte bin ich noch auf eine andere Idee gekommen.

    Wie wäre es damit

    <MyUserControl>	
       <i:Interaction.Behaviors>
           <behaviors:NumericTextBox />
       </i:Interaction.Behaviors>
    </MyUserControl>
    

    Das wäre ja auch eine nette Möglichkeit wenn das mit dem Behavior ausschalten nicht geht.

    Sprich ich definiere das Behavior bei der Verwendung des UserControls.

    Jetzt stellt sich nur noch die Frage. Wie leite ich das Behavior an die Textbox im UserControl weiter? Geht das?



  • Ich merk schon ich führe wieder selbst Gerpäche.
    Wobei wir wieder beim Thema sind:

    http://www.c-plusplus.net/forum/315656

    Aber nun gut habe es nun so gelöst dass ich das UserControlTemplate angepasst habe und nun den gesamten Content übergebe. Also die TextBox samt Behavior.

    Ist eine ingesamt sehr umfangreiche Lösung. Dafür dann auch sehr flexibel.


  • Administrator

    Etwas mehr Geduld wäre vielleicht angebracht 🙂
    Ich habe aktuell z.B. verdammt viel um die Ohren. Wenn ich mich mit einem Thema richtig befassen kann, heisst jemandem wirklich Hilfe bieten kann, dann höchstens am Abend, wo ich dann erschöpft vom Tag bin 😉

    Zu deinem Problem:
    Du weisst schon, dass diese Interactivity Behaviors nicht Teil des .Net Frameworks sind sondern ein Teil von Expression Blend? Es könnte daher gut sein, dass du schon nur deswegen wenig Hilfestellung dazu bekommst. In "reinem" .Net würde man Behaviors mit Attached DependencyProperties lösen. Dieses würde man über ein Boolean machen, welches man dann ein und ausschalten kann. Wodurch deine Frage auch schon beantwortet wäre.

    Hier etwas Code:

    public static class InputBehavior
    {
        public static DependencyProperty IsNumberProperty = DependencyProperty.RegisterAttached(
            "IsNumber",
            typeof(bool),
            typeof(InputBehavior),
            new FrameworkPropertyMetadata(null, InputBehavior.OnIsNumberChanged));
    
        public static bool GetIsNumber(DependencyObject target)
        {
            return (bool)target.GetValue(InputBehavior.IsNumberProperty);
        }
    
        public static void SetDoubleClickCommand(DependencyObject target, bool value)
        {
            target.SetValue(InputBehavior.IsNumberProperty, value);
        }
    
        private static void OnIsNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            /*
            Falls e.NewValue true ist und e.OldValue false, dann registrierst du dein Behavior.
            Falls e.NewValue false ist und e.OldValue true, dann deaktivierst du dein Behavior.
            */
        }
    
        // Was du sonst noch so für Methoden brauchst, z.B. auf Events reagieren.
    }
    
    <TextBox my:InputBehavior.IsNumber="{Binding WoAuchImmerRan}" />
    

    Referenz: http://msdn.microsoft.com/en-us/library/ms749011.aspx

    Im Internet gibt es auch schon zahlreiche fertige Lösungen für solche Attached DependencyProperties, mit welchen man eine TextBox auf reine Zahleneingabe umstellen kann.

    Grüssli

    PS: Und nun ist mein Essen kalt 😞



  • Hallo Dravere

    Etwas mehr Geduld wäre vielleicht angebracht

    Ok. Ich versuchs :-). Nach 2-3 Stunden finde ich dann halt meistens selber eine Lösung. Wobei ich die Eingangsfrage ja schon am 08.04 gestellt habe.

    Und in meiner ersten Frage habe ich dabei nicht mal auf die Behaviors von Expression Blend hingeweisen.

    Aber:
    Vielen Dank für deine Lösung. Ich werde das mal testen. Das mit den Attached Behavoirs war mir nicht klar dass man die so binden kann.


Anmelden zum Antworten