WPF C# binding code - why doesn't this simple example work?

TestCounter needs to be a DepenencyProperty.

Up vote 1 down vote favorite share g+ share fb share tw.

(just trying to understanding binding to a custom object). That is when clicking on the button to increase the counter in the model, the label isn't updated. Namespace testapp1 { public partial class MainWindow : Window { public TestModel _model; public MainWindow() { InitializeComponent(); InitializeComponent(); _model = new TestModel(); _model.

TestCounter = 0; this. DataContext = _model; } private void testButton_Click(object sender, RoutedEventArgs e) { _model. TestCounter = _model.

TestCounter + 1; Debug. WriteLine("TestCounter = " + _model. TestCounter); } } public class TestModel : DependencyObject { public int TestCounter { get; set; } } } thanks c# .net wpf binding link|improve this question asked Sep 8 '10 at 5:54Greg4,445127101 89% accept rate.

TestCounter needs to be a DepenencyProperty public int TestCounter { get { return (int)GetValue(TestCounterProperty); } set { SetValue(TestCounterProperty, value); } } // Using a DependencyProperty as the backing store for TestCounter. This enables animation, styling, binding, etc... public static readonly DependencyProperty TestCounterProperty = DependencyProperty. Register("TestCounter", typeof(int), typeof(TestModel), new UIPropertyMetadata(0)).

– Greg Sep 8 '10 at 6:01 You can if you implement INotifyPropertyChanged – Daniel Sep 8 '10 at 6:02 No, not at all - you can bind to any property of any POCO object, as long as you notify the target (e.g. The TextProperty on your Textbox) of any changes. DependenyProperties do this work for you, but you can also implement INotifyPropertyChanged on the TestModel class (as per @rudigrobler suggestion) and manually raise the change event... – IanR Sep 8 '10 at 6:04 @Daniel - added the following to the TestModel class however it still doesn't work? "public static readonly DependencyProperty TestCounterProperty = DependencyProperty.

Register("TestCounter", typeof(int), typeof(TestModel), new UIPropertyMetadata(0));" – Greg Sep 8 '10 at 6:07 hang off - I missed the changes to the TestCounter class – Greg Sep 8 '10 at 6:12.

For this simple example, consider using INotifyPropertyChanged and not DependencyProperties! UPDATE If you do want to use DPs, use the propdp snippet in VS2010 or Dr WPF's snippets for VS2008?

1 because you reworded to 'consider using' ;) – IanR Sep 8 '10 at 6:05.

You can implement the INotifyPropertyChanged interface in the System. ComponentModel namespace. I usually implement a Changed method that can take a number of property names and check for the event not being set.

I do that because sometimes I have multiple properties that depend on one value and I can call one method from all of my property setters. For instance if you had a Rectangle class with Width and Height properties and an Area read-only property that returns Width * Height, you could put Changed("Width", "Area"); in the property setter for Width. Public class TestModel : INotifyPropertyChanged { int m_TestCounter; public int TestCounter { get { return m_TestCounter; } set { m_TestCounter = value; Changed("TestCounter"); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion void Changed(params string propertyNames) { if (PropertyChanged!

= null) { foreach (string propertyName in propertyNames) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }.

– Greg Sep 13 '10 at 1:08 When your object is bound to a control, the control adds itself as a listener to the PropertyChanged event from the INotifyPropertyChanged interface. When you fire that event in the property setter the controls bound to that property update in the UI. Your code above will automatically update the UI whenever the TestCounter setter is called.

You do need to have a variable behind properties and call the Changed method in your setters, but it's easier to me than using DependencyProperty. – Jason Goemaat Sep 14 '10 at 20:39.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions