> Sounds good. As far as the FocusScopes go, there shouldn't be any issues,
> but it's an edge case to consider (I've been bitten too many times by custom
> FocusScopes).
> On Mon, Mar 15, 2010 at 3:08 PM, Josh Smith <flappleja...@gmail.com>wrote:
>> Thanks Pete. I was thinking that there could be an attached property of
>> type bool that is set on an element, instead of setting ValidatedProperty.
>> When set, that attached property figures out which property on the element
>> to monitor, such as Text on a TextBox. This would make it easier than
>> having to specify the property, though that would still be an option if you
>> need to specify it.
>> I'll have to look into FocusScopes, though I don't see any issues there (I
>> might be overlooking something...).
>> Josh
>> On Mon, Mar 15, 2010 at 6:31 AM, Peter O'Hanlon <pete.ohan...@gmail.com>wrote:
>>> The only thing that stands out to me is that this is going to have to be
>>> applied in a lot of places in a typical LOB application, so that might be a
>>> little bit tedious. What effects do FocusScope's have here? I'll need to
>>> play around with this a bit just to make sure there aren't any edge cases
>>> that occur (I'm primarily thinking of cases where loss of focus to a
>>> menu/toolbar triggers the validation but the parent FocusScope has changed
>>> from the textbox).
>>> Pete
>>> On Mon, Mar 15, 2010 at 2:24 PM, Josh Smith <flappleja...@gmail.com>wrote:
>>>> Thanks. Any pitfalls or gotchas sticking their heads out?
>>>> On Mon, Mar 15, 2010 at 1:03 AM, Peter O'Hanlon <pete.ohan...@gmail.com
>>>> > wrote:
>>>>> I like it - I know that it feels "dirty", but it's actually pretty darn
>>>>> cool.
>>>>> On Mon, Mar 15, 2010 at 3:54 AM, Josh Smith <flappleja...@gmail.com>wrote:
>>>>>> A while back Dr. WPF graced us with his clever hack of controlling
>>>>>> input focus from VM objects. It involved hijacking the VM's IDataErrorInfo
>>>>>> implementation, and doing all sorts of evil-genius stuff to make the input
>>>>>> caret move to the correct element. Today while I was *trying* to
>>>>>> read a great novel, I couldn't stop thinking about another way to control
>>>>>> input focus from a viewmodel object.
>>>>>> I put the novel down and did a quick spike of the idea. The source
>>>>>> code is attached (rename it from .DOC to .ZIP since gmail is terrified of
>>>>>> ZIP files for some reason). Here's the general idea...
>>>>>> Implement this interface on your VM class:
>>>>>> /// <summary>
>>>>>> /// Implemented by a ViewModel that needs to control
>>>>>> /// where input focus is in a View.
>>>>>> /// </summary>
>>>>>> public interface IFocusController
>>>>>> {
>>>>>> /// <summary>
>>>>>> /// Raised when the input focus should move to
>>>>>> /// a control whose 'active' dependency property
>>>>>> /// is bound to the specified property.
>>>>>> /// </summary>
>>>>>> event EventHandler<MoveFocusEventArgs> MoveFocus;
>>>>>> }
>>>>>> Next, in your VM object (which might implement IDataErrorInfo), do
>>>>>> something like this to support a Save button:
>>>>>> public ICommand SaveCommand
>>>>>> {
>>>>>> get { return new RelayCommand(this.Save); }
>>>>>> }
>>>>>> void Save()
>>>>>> {
>>>>>> if (this.HasError)
>>>>>> {
>>>>>> // The Error property knows which property is invalid.
>>>>>> this.RaiseMoveFocus(this.Error);
>>>>>> }
>>>>>> else
>>>>>> {
>>>>>> // Save to database...
>>>>>> System.Windows.MessageBox.Show("Saved");
>>>>>> }
>>>>>> }
>>>>>> bool HasError
>>>>>> {
>>>>>> get { return _validatedProperties.Any(prop =>
>>>>>> !String.IsNullOrEmpty(this[prop])); }
>>>>>> }
>>>>>> public event EventHandler<MoveFocusEventArgs> MoveFocus;
>>>>>> void RaiseMoveFocus(string focusedProperty)
>>>>>> {
>>>>>> var handler = this.MoveFocus;
>>>>>> if (handler != null)
>>>>>> {
>>>>>> handler(this, new MoveFocusEventArgs(focusedProperty));
>>>>>> }
>>>>>> }
>>>>>> Lastly, in your View, use my terribly(?) named attached property to
>>>>>> specify which DP on your elements is bound to the validated property of the
>>>>>> VM, for example:
>>>>>> <TextBox
>>>>>> Text="{Binding Path=FirstName, ValidatesOnDataErrors=True}"
>>>>>> *local:FocusControl.ValidatedProperty="TextBox.Text"*
>>>>>> />
>>>>>> I'm not sure that I like this approach yet. It's a pretty important
>>>>>> topic, so I thought I'd share this out amongst the Disciples for feedback.
>>>>>> Thanks,
>>>>>> Josh
>>>>> --
>>>>> Peter O'Hanlon
>>> --
>>> Peter O'Hanlon
> --
> Peter O'Hanlon