INotifyPropertyChanged не работает при динамическом связывании с использованием отражения - PullRequest
0 голосов
/ 08 августа 2011

У меня проблема с событием INotifyPropertyChanged, которое не работает при привязке выбранного элемента в коде.Все загружается нормально, но событие INotifyPropertyChanged никогда не срабатывает, когда я меняю свой выбор.Помощь?

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 Drinks 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
}

В моем основном классе у меня есть что-то вроде этого:

// 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);
            }
}

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Класс PropertyInfo не реализует INotifyPropertyChanged, и вы устанавливаете Source для экземпляра PropertyInfo.

2 голосов
/ 08 августа 2011

Я почти уверен, что эта строка виновна:

binding2.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;

Это обновит привязку только тогда, когда вы явно скажете объекту Binding обновить, вызвав UpdateSource().

Вы можете опустить эту строку, чтобы использовать значение по умолчанию, и она должна работать нормально ... а также прислушиваться к ответу Эрно.

...