I’m trying to bind a TextBlock’s Text property in a very dynamic way. I need to get the Path from an underlying object.
Here’s the DataTemplate:
<DataTemplate DataType={x:Type local:DummyClass}> <TextBlock Text={Binding Path=???} /> </DataTemplate>
The DummyClass object has a property named ‘FieldValuePath’ – the path that needs to be put where the ??? is.
The idea behind this is that the data template is supposed to be a GUI for viewing/editing any property of any object. So it’s kind of preferable to be able to declare XAML which would bind some controls (textboxes, textblocks, datepickers, etc) to a given property.
Maybe anyone has any suggestions on how to implement such thing?
If you create the binding in the code behind then you could get it to work. For example a simple code generated binding is:
Since the path in this binding (‘BindingPath’) is just a string, that string could come from any available object.
You’ll need to hook into the creation of your data items to set these binding though.
A further possibility based on your comments:
This blog post outlines a way to create a custom binding class by inheriting from MarkupExtension. You may be able to use this as a starting point to wrap my suggestion into a reusable xaml markup for your special binding case.
More thoughts:
Okay, this was an interesting problem, so I decided to spend a little time seeing if I could come up with a working solution. I apologise in advance for the length of the following code samples…
Basing my solution on the blog post I linked to above I created this class:
You can use this new markup with the following xaml:
Where TextBox can be any class that inherits from control and Text can be any dependency property.
Obviously if you need to expose any of the other databinding options (such as one or two way binding) then you’ll need to add more properties to the class.
While this is a complicated solution, one advantage that it has over using a converter is that the binding that is finally created is against the actual inner property rather than the object. This means that it correctly reacts to PropertyChanged events.