But yea I think the first option is probably ideal.. the other options are
there because WPF is awesome and you can do crazy shit.... oww my beer is
talking now.. :)
> here is take 3 :)
> P.S I am on my second Pint so excuse any stupid mistakes :D
> The idea is that the Attached behavior injects a command that the ViewModel
> can use to get an element focused. (it is still using the namescope idea).
> This is what the ViewModel does
> ICommand focusCommand;
> public ICommand FocusCommand
> {
> get { return focusCommand; }
> set
> {
> focusCommand = value;
> OnPropertyChanged("FocusCommand");
> }
> }
> public ICommand Save { get; private set; }
> public MyViewModel()
> {
> Save = new RelayCommand(x =>
> {
> if (FocusCommand.CanExecute("Name"))
> FocusCommand.Execute("Name");
> }
> So the ViewModel exposes a command property but never sets it.
> Then in the View you work a bit of magic
> <Grid focusStuff:FocusedBehaviourTake3.HandleFocusElement="True"
> focusStuff:FocusedBehaviourTake3.FocusCommand="{Binding FocusCommand,
> Mode=TwoWay}" >
> Basically the Behaviour will inject a command that the ViewModel will
> execute. This option gives also the oportunity to check if you can actually
> give focus to the control which is very interesting from the ViewModel stand
> point. What do you think?
> Regards
> Marlon
> WPF Blog - http://marlongrech.wordpress.com/
> Microsoft MVP for Client App
> On Mon, Mar 15, 2010 at 10:08 PM, Marlon Grech <marlongr...@gmail.com>wrote:
>> actually there is a way how you can work around that... but I am not gonna
>> do that... the other way is to inject a command in the ViewModel and the
>> ViewModel can then execute that command...
>> actually you know what... I am at a pub and have nothing to do (besides
>> drinking beer) so I will have a go with that Idea :) lol
>> Regards
>> Marlon
>> WPF Blog - http://marlongrech.wordpress.com/
>> Microsoft MVP for Client App
>> On Mon, Mar 15, 2010 at 10:06 PM, Marlon Grech <marlongr...@gmail.com>wrote:
>>> true ... it is a show stopper isn't it...
>>> Regards
>>> Marlon
>>> WPF Blog - http://marlongrech.wordpress.com/
>>> Microsoft MVP for Client App
>>> On Mon, Mar 15, 2010 at 10:04 PM, Sacha Barber <sacha.bar...@gmail.com>wrote:
>>>> I do not like the idea of the Binding not firing.
>>>> On Mon, Mar 15, 2010 at 9:56 PM, Marlon Grech <marlongr...@gmail.com>wrote:
>>>>> may I ask why you guys prefer option 1? Just for curiosity...
>>>>> Regards
>>>>> Marlon
>>>>> WPF Blog - http://marlongrech.wordpress.com/
>>>>> Microsoft MVP for Client App
>>>>> On Mon, Mar 15, 2010 at 9:20 PM, Peter O'Hanlon <
>>>>> pete.ohan...@gmail.com> wrote:
>>>>>> Same here.
>>>>>> On Mon, Mar 15, 2010 at 9:18 PM, Sacha Barber <sacha.bar...@gmail.com
>>>>>> > wrote:
>>>>>>> I prefer option 1 actually
>>>>>>> On Mon, Mar 15, 2010 at 8:43 PM, Marlon Grech <marlongr...@gmail.com
>>>>>>> > wrote:
>>>>>>>> P.S sorry for ugly code and all that but the code I produced is just
>>>>>>>> to show you guys the idea ....
>>>>>>>> Regards
>>>>>>>> Marlon
>>>>>>>> WPF Blog - http://marlongrech.wordpress.com/
>>>>>>>> Microsoft MVP for Client App
>>>>>>>> On Mon, Mar 15, 2010 at 8:42 PM, Marlon Grech <
>>>>>>>> marlongr...@gmail.com> wrote:
>>>>>>>>> Attached is take 2...
>>>>>>>>> Basically I hate it when my ViewModel has to implement all these
>>>>>>>>> interfaces... It feels like back in Java days to me...
>>>>>>>>> so the idea here is to still use namescopes but leverage the
>>>>>>>>> databinding capabilities of WPF... so that you can do something like this
>>>>>>>>> <Grid focusStuff:FocusedBehaviourTake2.FocusElement="{Binding
>>>>>>>>> Focus}">
>>>>>>>>> and in the VM
>>>>>>>>> Save = new RelayCommand( x => Focus= "Name");
>>>>>>>>> Basically in the ViewModel you set a property that exposes the
>>>>>>>>> element that should get focus. The attached behavior (which accepts binding)
>>>>>>>>> will get triggered when the property changes. THERE IS ONE SIDE EFFECT OF
>>>>>>>>> THIS. Basically if the viewmodel sets the Focus property to be the same the
>>>>>>>>> attached behavior will not get triggered again... this might be a show
>>>>>>>>> stopper for this idea... what do you guys think?
>>>>>>>>> which approach would you like best?
>>>>>>>>> Regards
>>>>>>>>> Marlon
>>>>>>>>> WPF Blog - http://marlongrech.wordpress.com/
>>>>>>>>> Microsoft MVP for Client App
>>>>>>>>> On Mon, Mar 15, 2010 at 8:25 PM, Daniel Vaughan <
>>>>>>>>> dbvaug...@gmail.com> wrote:
>>>>>>>>>> Good thinking Marlon. As Pete said, very innovative.
>>>>>>>>>> On Mar 15, 7:33 pm, Marlon Grech <marlongr...@gmail.com> wrote:
>>>>>>>>>> > something like this... but I need to do something else so that
>>>>>>>>>> its cooler...
>>>>>>>>>> > The Idea is that rather then setting an attached property to
>>>>>>>>>> every element
>>>>>>>>>> > you want to control you just set it once and find that element
>>>>>>>>>> by using WPF
>>>>>>>>>> > Namescopes.
>>>>>>>>>> > Attached is a prototype... yet I just built this now... did not
>>>>>>>>>> test it...
>>>>>>>>>> > and probably I have bugs all over the place.,... I just did it
>>>>>>>>>> to show you
>>>>>>>>>> > what I mean
>>>>>>>>>> > Regards
>>>>>>>>>> > Marlon
>>>>>>>>>> > WPF Blog -http://marlongrech.wordpress.com/
>>>>>>>>>> > Microsoft MVP for Client App
>>>>>>>>>> > On Mon, Mar 15, 2010 at 5:50 PM, Josh Smith <
>>>>>>>>>> flappleja...@gmail.com> wrote:
>>>>>>>>>> > > What do you have in mind?
>>>>>>>>>> > > On Mon, Mar 15, 2010 at 10:46 AM, Marlon Grech <
>>>>>>>>>> marlongr...@gmail.com>wrote:
>>>>>>>>>> > >> mmm... interesting approach... what about leveraging
>>>>>>>>>> Namescopes for such a
>>>>>>>>>> > >> thing?
>>>>>>>>>> > >> Regards
>>>>>>>>>> > >> Marlon
>>>>>>>>>> > >> WPF Blog -http://marlongrech.wordpress.com/
>>>>>>>>>> > >> Microsoft MVP for Client App
>>>>>>>>>> > >> On Mon, Mar 15, 2010 at 3:12 PM, Peter O'Hanlon <
>>>>>>>>>> pete.ohan...@gmail.com>wrote:
>>>>>>>>>> > >>> Sounds good. As far as the FocusScopes go, there shouldn't
>>>>>>>>>> be any issues,
>>>>>>>>>> > >>> but it's an edge case to consider (I've been bitten too many
>>>>>>>>>> times by custom
>>>>>>>>>> > >>> FocusScopes).
>>>>>>>>>> > >>> On Mon, Mar 15, 2010 at 3:08 PM, Josh Smith <
>>>>>>>>>> flappleja...@gmail.com>wrote:
>>>>>>>>>> > >>>> Thanks Pete. I was thinking that there could be an attached
>>>>>>>>>> property of
>>>>>>>>>> > >>>> type bool that is set on an element, instead of setting
>>>>>>>>>> ValidatedProperty.
>>>>>>>>>> > >>>> When set, that attached property figures out which
>>>>>>>>>> property on the element
>>>>>>>>>> > >>>> to monitor, such as Text on a TextBox. This would make it
>>>>>>>>>> easier than
>>>>>>>>>> > >>>> having to specify the property, though that would still be
>>>>>>>>>> an option if you
>>>>>>>>>> > >>>> need to specify it.
>>>>>>>>>> > >>>> I'll have to look into FocusScopes, though I don't see any
>>>>>>>>>> issues there
>>>>>>>>>> > >>>> (I might be overlooking something...).
>>>>>>>>>> > >>>> Josh
>>>>>>>>>> > >>>> On Mon, Mar 15, 2010 at 6:31 AM, Peter O'Hanlon <
>>>>>>>>>> pete.ohan...@gmail.com
>>>>>>>>>> > >>>> > wrote:
>>>>>>>>>> > >>>>> The only thing that stands out to me is that this is going
>>>>>>>>>> to have to
>>>>>>>>>> > >>>>> be applied in a lot of places in a typical LOB
>>>>>>>>>> application, so that might be
>>>>>>>>>> > >>>>> a little bit tedious. What effects do FocusScope's have
>>>>>>>>>> here? I'll need to
>>>>>>>>>> > >>>>> play around with this a bit just to make sure there aren't
>>>>>>>>>> any edge cases
>>>>>>>>>> > >>>>> that occur (I'm primarily thinking of cases where loss of
>>>>>>>>>> focus to a
>>>>>>>>>> > >>>>> menu/toolbar triggers the validation but the parent
>>>>>>>>>> FocusScope has changed
>>>>>>>>>> > >>>>> from the textbox).
>>>>>>>>>> > >>>>> Pete
>>>>>>>>>> > >>>>> On Mon, Mar 15, 2010 at 2:24 PM, Josh Smith <
>>>>>>>>>> flappleja...@gmail.com>wrote:
>>>>>>>>>> > >>>>>> Thanks. Any pitfalls or gotchas sticking their heads
>>>>>>>>>> out?
>>>>>>>>>> > >>>>>> On Mon, Mar 15, 2010 at 1:03 AM, Peter O'Hanlon <
>>>>>>>>>> > >>>>>> pete.ohan...@gmail.com> wrote:
>>>>>>>>>> > >>>>>>> I like it - I know that it feels "dirty", but it's
>>>>>>>>>> actually pretty
>>>>>>>>>> > >>>>>>> darn cool.
>>>>>>>>>> > >>>>>>> On Mon, Mar 15, 2010 at 3:54 AM, Josh Smith <
>>>>>>>>>> flappleja...@gmail.com
>>>>>>>>>> > >>>>>>> > wrote:
>>>>>>>>>> > >>>>>>>> A while back Dr. WPF graced us with his clever hack of
>>>>>>>>>> controlling
>>>>>>>>>> > >>>>>>>> input focus from VM objects. It involved hijacking the
>>>>>>>>>> VM's IDataErrorInfo
>>>>>>>>>> > >>>>>>>> implementation, and doing all sorts of evil-genius
>>>>>>>>>> stuff to make the input
>>>>>>>>>> > >>>>>>>> caret move to the correct element. Today while I was
>>>>>>>>>> *trying* to
>>>>>>>>>> > >>>>>>>> read a great novel, I couldn't stop thinking about
>>>>>>>>>> another way to control
>>>>>>>>>> > >>>>>>>> input focus from a viewmodel object.
>>>>>>>>>> > >>>>>>>> I put the novel down and did a quick spike of the idea.
>>>>>>>>>> The source
>>>>>>>>>> > >>>>>>>> code is attached (rename it from .DOC to .ZIP since
>>>>>>>>>> gmail is terrified of
>>>>>>>>>> > >>>>>>>> ZIP files for some reason). Here's the general idea...
>>>>>>>>>> > >>>>>>>> Implement this interface on your VM class:
>>>>>>>>>> > >>>>>>>> /// <summary>
>>>>>>>>>> > >>>>>>>> /// Implemented by a ViewModel that needs to control
>>>>>>>>>> > >>>>>>>> /// where input focus is in a View.
>>>>>>>>>> > >>>>>>>> /// </summary>
>>>>>>>>>> > >>>>>>>> public interface IFocusController
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> /// <summary>
>>>>>>>>>> > >>>>>>>> /// Raised when the input focus should move to
>>>>>>>>>> > >>>>>>>> /// a control whose 'active' dependency property
>>>>>>>>>> > >>>>>>>> /// is bound to the specified property.
>>>>>>>>>> > >>>>>>>> /// </summary>
>>>>>>>>>> > >>>>>>>> event EventHandler<MoveFocusEventArgs> MoveFocus;
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> Next, in your VM object (which might implement
>>>>>>>>>> IDataErrorInfo), do
>>>>>>>>>> > >>>>>>>> something like this to support a Save button:
>>>>>>>>>> > >>>>>>>> public ICommand SaveCommand
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> get { return new RelayCommand(this.Save); }
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> void Save()
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> if (this.HasError)
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> // The Error property knows which property is
>>>>>>>>>> invalid.
>>>>>>>>>> > >>>>>>>> this.RaiseMoveFocus(this.Error);
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> else
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> // Save to database...
>>>>>>>>>> > >>>>>>>> System.Windows.MessageBox.Show("Saved");
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> bool HasError
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> get { return _validatedProperties.Any(prop =>
>>>>>>>>>> > >>>>>>>> !String.IsNullOrEmpty(this[prop])); }
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> public event EventHandler<MoveFocusEventArgs>
>>>>>>>>>> MoveFocus;
>>>>>>>>>> > >>>>>>>> void RaiseMoveFocus(string focusedProperty)
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> var handler = this.MoveFocus;
>>>>>>>>>> > >>>>>>>> if (handler != null)
>>>>>>>>>> > >>>>>>>> {
>>>>>>>>>> > >>>>>>>> handler(this, new
>>>>>>>>>> MoveFocusEventArgs(focusedProperty));
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> }
>>>>>>>>>> > >>>>>>>> Lastly, in your View, use my terribly(?) named attached
>>>>>>>>>> property to
>>>>>>>>>> > >>>>>>>> specify which DP on your elements is bound to the
>>>>>>>>>> validated property of the
>>>>>>>>>> > >>>>>>>> VM, for example:
>>>>>>>>>> > >>>>>>>> <TextBox
>>>>>>>>>> > >>>>>>>> Text="{Binding Path=FirstName,
>>>>>>>>>> ValidatesOnDataErrors=True}"
>>>>>>>>>> *local:FocusControl.ValidatedProperty="TextBox.Text"*
>>>>>>>>>> > >>>>>>>> />
>>>>>>>>>> > >>>>>>>> I'm not sure that I like this approach yet. It's a
>>>>>>>>>> pretty important
>>>>>>>>>> > >>>>>>>> topic, so I thought I'd share this out amongst the
>>>>>>>>>> Disciples for feedback.
>>>>>>>>>> > >>>>>>>> Thanks,
>>>>>>>>>> > >>>>>>>> Josh
>>>>>>>>>> > >>>>>>> --
>>>>>>>>>> > >>>>>>> Peter O'Hanlon
>>>>>>>>>> > >>>>> --
>>>>>>>>>> > >>>>> Peter O'Hanlon
>>>>>>>>>> > >>> --
>>>>>>>>>> > >>> Peter O'Hanlon
>>>>>>>>>> > TestFocus.zip.doc
>>>>>>>>>> > 140KViewDownload
>>>>>>> --
>>>>>>> Sacha Barber
>>>>>>> sacha.bar...@gmail.com
>>>>>> --
>>>>>> Peter O'Hanlon
>>>> --
>>>> Sacha Barber
>>>> sacha.bar...@gmail.com