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