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); }
>>>>>>>> }
>>>>>>>> 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