• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

ICommand woes...

L

Lloyd Dupont

#1
I tried to create a SetColor command and a ColorPicker which uses it.

There is one effect I cannot reproduce, it is tracking the CommandSource and
wether it's valid.

By that I mean if I create a MenuItem like that:

<MenuItem Header="Blue" Command="{x:Static local:MyCommands.SetColor}"
CommandParameter="{x:Static Colors.Blue}" />

It enables/disables depending on wether the currently focused element
respond to the SetColor command.


But my ColorPicker never get any CanExecute or whatever event call,
therefore I cannot update it appropriately (i.e. enable/disable) when the
focused element change.

I implemented ICommandSource, used a RoutedEvent, I never get any relevant
info....

Any idea what I could have missed?!?
 

My Computer

L

Lloyd Dupont

#2
found it!

it's quite tricky, I remember read about it in a blog 6 month ago but it's
nowhere in the documentation!!!

RoutedCommand.CanExecuteChanged strore the event handlers as WeakReference.
Therefore you have to hold a reference to the handlers your self if you want
your event handler to be called....
 

My Computer

R

Radek Cerny

#3
Well done!

I am playing in the same area and am sure to have come across this soon.

Thanks.

"Lloyd Dupont" <net.galador@ld> wrote in message
news:eX9XTzHuHHA.1672@TK2MSFTNGP06.phx.gbl...
> found it!
>
> it's quite tricky, I remember read about it in a blog 6 month ago but it's
> nowhere in the documentation!!!
>
> RoutedCommand.CanExecuteChanged strore the event handlers as
> WeakReference.
> Therefore you have to hold a reference to the handlers your self if you
> want
> your event handler to be called....
>
 

My Computer

L

Lloyd Dupont

#4
Thanks!! :-D

Additional tip:

I was trying to get a value from the command source:
I.e. I have a color picker, I want it to be initialized to the current color
of the SetColorCommand target.
There is no way to do that!

But... little trick....
ICommand.CanExecute(object obj) take any object as argument.

I used something like:
public class CommandCanExecuteArg
{
object val;
public CommandCanExecuteArg(object val)
{
this.val = val;
}
public object Parameter { get { return val; } }
public object ReturnValue { get; set; }
}


and I pass an instance of it to CanExecute(), this way the
SetColorCommandTarget can return its current color in ReturnValue

--
Regards,
Lloyd Dupont
NovaMind Software
Mind Mapping at its best
www.nova-mind.com

"Radek Cerny" <radekcerny@nospam.optusnet.com.au> wrote in message
news:O8ZpNDRuHHA.3368@TK2MSFTNGP02.phx.gbl...
> Well done!
>
> I am playing in the same area and am sure to have come across this soon.
>
> Thanks.
>
> "Lloyd Dupont" <net.galador@ld> wrote in message
> news:eX9XTzHuHHA.1672@TK2MSFTNGP06.phx.gbl...
>> found it!
>>
>> it's quite tricky, I remember read about it in a blog 6 month ago but
>> it's
>> nowhere in the documentation!!!
>>
>> RoutedCommand.CanExecuteChanged strore the event handlers as
>> WeakReference.
>> Therefore you have to hold a reference to the handlers your self if you
>> want
>> your event handler to be called....
>>

>
>
 

My Computer

Users Who Are Viewing This Thread (Users: 1, Guests: 0)