Tim Hibbard

Software Architect for EnGraph software


News





Add to Google



My Stats

  • Posts - 593
  • Comments - 353
  • Trackbacks - 507

Twitter












Tag Cloud


Recent Comments


Recent Posts


Article Categories


Archives


Post Categories


Image Galleries


EnGraph Blogs


Links


Other


Roll



Let's say you have a custom WPF control called SearchTextBox.  It has a textbox and a button labeled "search".  Simple enough, you reuse it in your application when you want to provide search. 

Then one day, you decide you need this control needs to be bindable.  So you expose a public property Text and map it to textSearch just like you would in WinForms.

Well, that doesn't work, so you google around and stumble upon Dependency Properties and learn how to create your own (VS snippet shortcut propdb) and create a Text DP.

Now you spend 30 minutes trying to map your Text DP to your textSearch.Text until you finally figure out that your DP snippet lead you astray and there is one more step that didn't get included in the shortcut.  In the UIPropertyMetaData, you need to specify a function to call when the property changes - so you can set textSearch.Text.

The function looks like this:

static void textChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) { SearchTextBox searchTextBox = (SearchTextBox)property; searchTextBox.textSearch.Text= (string)args.NewValue; }

And the rest of the DP looks like this:

public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(SearchTextBox), new UIPropertyMetadata(string.Empty, new PropertyChangedCallback(textChangedCallBack)));

 

The important part here is what wasn't created by the VS snippet :

new UIPropertyMetadata(string.Empty, new PropertyChangedCallback(textChangedCallBack))

Now you are binding to your custom control and all is good.

 


posted @ Tuesday, April 22, 2008 1:11 AM | Filed Under [ .NET WPF ]

Comments

Gravatar # re: WPF Custom Control Dependency Property Gotcha
Posted by Dmitri on 5/15/2008 12:38 PM
Umm, why should you need to do this? The binding should work perfectly well without it.
Gravatar # re: WPF Custom Control Dependency Property Gotcha
Posted by Tim Hibbard on 5/15/2008 12:42 PM
Actually, it doesn't. I've tried :)
Gravatar # re: WPF Custom Control Dependency Property Gotcha
Posted by Mike on 5/15/2008 2:46 PM
Are you sure a binding doesn't work? I had a similar issue with a User Control and found that the binding has to include the ElementName.

First, add an x:Name attribute to your UserControl tag (say, with a value of "Main"). Then your binding will look like this:

<TextBox Text="{Binding ElementName=Main,Path=SearchText}"/>

No need for any DP change event code.
Gravatar # re: WPF Custom Control Dependency Property Gotcha
Posted by Tim Hibbard on 5/15/2008 3:42 PM
My example was for people that needed to bind their business objects to a user control, which requires a DP...unless I'm wrong.
Gravatar # re: WPF Custom Control Dependency Property Gotcha
Posted by Nick on 5/20/2008 1:24 PM
Mike's thing works well. The thing I missed was adding a X:Name to the <Window.
Post a comment





 

Please add 8 and 7 and type the answer here: