I'm having an issue with the INotifyPropertyChanged event not working when binding selected item in code. Everything loads up fine but the INotifyPropertyChanged event never gets trigger when I change my selection. Help?
public enum Foods
{
Burger,
Hotdog
}
public enum Drinks
{
Pop,
Coffee
}
// Enum collection class
public class FoodEnumerationCollection: INotifyPropertyChanged
{
/// <summary>
/// Declare the event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
private Foods food;
private Drinks drink;
public Foods Food
{
get
{
return this.food;
}
set
{
this.food= value;
OnPropertyChanged("Food");
}
}
public Dr开发者_StackOverflow社区inks Drink
{
get
{
return this.drink;
}
set
{
this.drink= value;
OnPropertyChanged("Drink");
}
}
#region Protected Methods
/// <summary>
/// Create the OnPropertyChanged method to raise the event for UI
/// </summary>
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
In my main class I have something like this:
// instantiate food enumeration class
FoodEnumerationCollection foodEnumerationCollection = new FoodEnumerationCollection();
// Loop through all properties
foreach (PropertyInfo propertyInfo in this.foodEnumerationCollection.GetType().GetProperties())
{
if (propertyInfo.CanWrite)
{
ComboBox comboBox = new ComboBox();
comboBox.Name = propertyInfo.Name;
comboBox.Margin = new Thickness(5, 5, 5, 5);
comboBox.Width = 100;
comboBox.Height = 25;
// DataSource
comboBox.ItemsSource = Enum.GetValues(propertyInfo.PropertyType);
// Set binding for selected item
object value = propertyInfo.GetValue(foodEnumerationCollection, null);
Binding binding2 = new Binding();
binding2.Source = propertyInfo;
binding2.Path = new PropertyPath(propertyInfo.Name);
binding2.Mode = BindingMode.TwoWay;
binding2.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
comboBox.SetBinding(ComboBox.SelectedItemProperty, binding2);
this.FoodMenu.Items.Add(comboBox);
}
}
The PropertyInfo class does not implement the INotifyPropertyChanged and you are setting the Source to an instance of PropertyInfo.
I'm pretty sure this line is the culprit:
binding2.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
That will only update the binding when you explicitly tell the Binding
object to update by calling UpdateSource()
.
You can omit that line to use the default and it should work fine... as well as heeding Erno's answer.
精彩评论