> 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