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:
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"); > } > }
> 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:
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"); > } > }
> 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:
> 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"); >> } >> }
>> 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:
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).
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"); >>> } >>> }
>>> 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:
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"); >>>> } >>>> }
>>>> 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:
>>>> 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.
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"); >>>>> } >>>>> }
>>>>> 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:
>>>>> 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.
> 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"); >>>>>> } >>>>>> }
>>>>>> 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:
>>>>>> 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.
> 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"); >>>>>>> } >>>>>>> }
>>>>>>> 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:
>>>>>>> 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.
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
>> 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"); >>>>>>>> } >>>>>>>> }
>>>>>>>> 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:
>>>>>>>> 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.
On Mon, Mar 15, 2010 at 6: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
>>> 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"); >>>>>>>>> } >>>>>>>>> }
>>>>>>>>> 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:
>>>>>>>>> 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.
On Mon, Mar 15, 2010 at 6: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
>>> 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"); >>>>>>>>> } >>>>>>>>> }
>>>>>>>>> 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:
>>>>>>>>> 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.
yea I think Namescope can be leveraged in this specific scenario...
there is another way of doing this which would actually be cooler because you do not need to implement any interfaces... let me write a quick sample.... brb
> I like that Marlon. It's a neat twist, and an innovative use of namescopes.
> On Mon, Mar 15, 2010 at 6: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
>>>> 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"); >>>>>>>>>> } >>>>>>>>>> }
>>>>>>>>>> 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:
>>>>>>>>>> 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.
> 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
> >> 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"); > >>>>>>>> } > >>>>>>>> }
> >>>>>>>> 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:
> >>>>>>>> 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.
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?
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
> > >> 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); } > > >>>>>>>> }
> > >>>>>>>> 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:
> > >>>>>>>> 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.
> 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?
> 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
>> > >> 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); } >> > >>>>>>>> }
>> > >>>>>>>> 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:
>> > >>>>>>>> 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.
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 ....
>> 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?
>> 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
>>> > >> 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); } >>> > >>>>>>>> }
>>> > >>>>>>>> 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:
>>> > >>>>>>>> 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.
>>> 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?
>>> 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
>>>> > >> 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); } >>>> > >>>>>>>> }
>>>> > >>>>>>>> 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:
>>>> > >>>>>>>> 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.
>>>> 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?
>>>> 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
>>>>> > >> 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); } >>>>> > >>>>>>>> }
>>>>> > >>>>>>>> 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:
>>>>> > >>>>>>>> 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.
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 ....
>>>>> 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?
>>>>> 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
>>>>>> > 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); } >>>>>> > >>>>>>>> }
>>>>>> > >>>>>>>> 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:
>>>>>> > >>>>>>>> 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
> 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 ....
>>>>>> 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?
>>>>>> 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
>>>>>>> > 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); } >>>>>>> > >>>>>>>> }
>>>>>>> > >>>>>>>> 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:
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 ....
>>>>> 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?
>>>>> 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
>>>>>> > 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); } >>>>>> > >>>>>>>> }
>>>>>> > >>>>>>>> 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:
>>>>>> > >>>>>>>> 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
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
> 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 ....
>>>>>>> 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?
>>>>>>> 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
>>>>>>>> > 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); } >>>>>>>> > >>>>>>>> }
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?
> 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
>> 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 ....
>>>>>>> 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
>>>>>>>> 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?
>>>>>>>> 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 >>>>>>>>> > >>>>>>>> {
to make this less magic one could create an interface and make the Attached Behaviour set a property on that interface.... yet having said that then why not go to Take 1.... mmmm.... aa well... its good to have option now all you need to do is pick one :)
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.. :)
> 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?
> 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
>>> 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 ....