[ 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? |