[ mmix @ 14.11.2011. 14:22 ] @
Dakle, imam checkbox kontrolu (infragistics) i treba da zakacim ValueChaged event iz te kontrole na ICommand u viewmodelu i da pri pozivu te komande dobijem neki argument koji je bindovan u XAMLu. Posto xamCheckEditor nema Command i CommandArgument morao sam da pribegnem pravljenju svog behaviora koji attachuje dva dependency propeortia na xamcheckeditor i zakaci event i omoguci poziv komande:

Code (csharp):

    public static class XamCheckEditorLOBBehavior
    {
        public static DependencyProperty ValueChangedProperty = DependencyProperty.RegisterAttached("ValueChanged",
                                                                                                    typeof(ICommand),
                                                                                                    typeof(XamCheckEditorLOBBehavior),
                                                                                                    new UIPropertyMetadata(XamCheckEditorLOBBehavior.ModifyValueChanged));
        public static DependencyProperty ValueChangedArgumentProperty = DependencyProperty.RegisterAttached("ValueChangedArgument",
                                                                                                            typeof(Tuple<bool,string>),
                                                                                                            typeof(XamCheckEditorLOBBehavior),
                                                                                                            new PropertyMetadata(null));


        public static void SetValueChanged(UIElement element, ICommand value)
        {
            element.SetValue(ValueChangedProperty, value);
        }
        public static void SetValueChangedArgument(UIElement element, Tuple<bool, string> value)
        {
            element.SetValue(ValueChangedArgumentProperty, value);
        }

        private static void ModifyValueChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
           
            XamCheckEditor element = target as XamCheckEditor;
            if (element == null) throw new InvalidOperationException("This behavior can be attached to XamCheckEditor only.");
            if ((e.NewValue != null) && (e.OldValue == null))
            {
                element.ValueChanged += XamCheckEditor_ValueChanged;
            }
            else if ((e.NewValue == null) && (e.OldValue != null))
            {
                element.ValueChanged -= XamCheckEditor_ValueChanged;
            }
        }


        private static void XamCheckEditor_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            UIElement element = (UIElement)sender;
            ICommand command = (ICommand)element.GetValue(XamCheckEditorLOBBehavior.ValueChangedProperty);
            Tuple<bool, string> commandArgument = (Tuple<bool, string>)element.GetValue(XamCheckEditorLOBBehavior.ValueChangedArgumentProperty);
            command.Execute(commandArgument);
        }
    }


i to onda lepo zakacim

Code (xml):

<ig:XamCheckEditor Grid.Column="0"
     beh:XamCheckEditorLOBBehavior.ValueChanged="{Binding Path=toggleLOBCommand}"
     beh:XamCheckEditorLOBBehavior.ValueChangedArgument="{Binding Path=item}" />


i to radi.

Moje pitanje je, moze li ovaj c# kod gore da se napravi malo jednostavnije, tj ima li neka ispomoc po ovom pitanju da se smanji broj (ili bar velicina) ovih behavior klasa. Imam jos podosta ovakvih da napravim (sa obzirom na to da se vezuju za tip i vrstu eventa) pa me interesuje moze li ovo lakse i ima li vec nesto u MVVMu (Prismu?) sto mi odradi bar deo posla?
[ logic_rabbit @ 14.11.2011. 15:00 ] @
Imas u MVVMLight frameworku jednu klasu koja se zove EventToCommand koja sluzi za to.
Posto je MVVMLight OpenSource probaj. http://mvvmlight.codeplex.com/
[ mmix @ 14.11.2011. 15:32 ] @
Hmm, zapravo, sad kad gledam njihov primer, taj behavoir izgleda postoji samo zbog silverlighta, ja izgleda mogu bez problema da iskoristim ovaj pristup za WPF kroz blend, bez potrebe za rucnim EventToCommand (cini mi se da je InvokeCOmmandAction upravo to):


Code (xml):


xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

<ig:XamCheckEditor Grid.Column="0">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="ValueChanged">
            <i:InvokeCommandAction Command="{Binding Path=toggleLOBCommand}" CommandParameter="{Binding path=item}"/>                  
        </i:EventTrigger>                
    </i:Interaction.Triggers>
</ig:XamCheckEditor>
 


bas cu da probam... Ovo bi mi resilo sve proleme bez ijedne linije c# koda.
[ mmix @ 14.11.2011. 20:08 ] @
Radi

Jedino sto mora da se u reference doda System.Windows.Interactivity
[ logic_rabbit @ 14.11.2011. 22:18 ] @
Radis WPF umjesto Silverlight-a pih :P