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