I am having trouble databinding a TextBox.Text
property to a object\'s method. The idea is allowing the user to write in a TextBox
a file name and then
Databinding requires the NotifyPropertyChanged
event to be called when the source is updated. In this case, you'd want to wrap this function call in a get/set like so:
public class FileWrapper: System.ComponentModel.INotifyPropertyChanged{
private string m_filename;
public string FileExtension{
get{ return GetFileExtension(FileName);}
}
public string FileName{
get{ return m_filename;}
set{ m_filename = value; OnPropertyChanged("FileName"); OnPropertyChanged( "FileExtension");
}
public string GetFileExtension( string filename){
//implementation
}
public event System.ComponentModel.NotifyPropertyChangedEvent PropertyChanged = (a,b)=>{};
protected void OnPropertyChanged(string property){
PropertyChanged( this, new System.ComponentModel.PropertyChangedEventArgs( property ));
}
}
Ok, seems like this a bug when running WPF 4.0, as can be seen in comments here.
Woops, I was a bit hasty .. the example works perfectly as long you compile it for the 3.5 framework (in VS 2010). But if you convert it to WPF 4.0 project the method WeightOnPlanet on ObjectDataProvider is nolonger invoked on odp2 when you edit the textbox. I have tried to find any new Attributes on either the Binding or the ObjectDataProvider – but nothing has worked out so far …
When compiling in 3.5, it works fine here.
Is the DataContext
set? In your code-behind, did you set the value for your TextBlock
to "saadsas" (I can only guess), which broke your databinding?
While it's possible to use Binding
to call a method and get its return value, it's not straightforward. It's much simpler to bind to properties, and to use the combination of binding and change notification to get the result you're looking for.
Create a class with two properties, Filename
and Extension
. Filename
is just a read/write string property. Extension
is a read-only string property whose getter calls the method that you're trying to call.
Now make that class implement INotifyPropertyChanged
, because if a property can change in code, it needs a way of telling the binding that it has done so. Make the setter of the Filename
property notify bindings that the Extension
property has changed.
Add a Binding
to a TextBox
that binds to the Filename
property using the TwoWay
mode. Add a Binding
to a TextBox
that binds to Extension
using the default OneWay
mode.
The sequence of events is:
Filename
into a bound TextBox
and presses TAB.TextBox
loses focus.Binding
's mode is TwoWay
, and it's using the default behavior of updating the source when the target loses focus, that's what it does.Binding
updates the source by calling the Filename
setter.Filename
setter raises PropertyChanged
.Binding
handles PropertyChanged
, looks at its argument, and sees that the Extension
property has changed.Binding
calls the Extension
property's getter.Extension
property's getter calls the method to determine the extension for Filename
, and returns it to the Binding
.Binding
updates its target TextBox
with the new value of Extension
.This is the core concept underlying data binding and the MVVM pattern. Once you understand it, it becomes second nature, and WPF development becomes about ten million times easier.
Looks like you need to get an understanding of MVVM , check this classic article http://msdn.microsoft.com/en-us/magazine/dd419663.aspx