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