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