PropertyChanged член INotifyPropertyChanged всегда нулевой - PullRequest
3 голосов
/ 23 января 2012

У меня есть класс следующим образом

public partial class Configuration : INotifyPropertyChanged
{
    private bool _isToolTips;
    public bool IsToolTips
    {
        get { return _isToolTips; }
        set { Set(this, "IsToolTips", ref _isToolTips, value, PropertyChanged); }
    }

    #region INotifyPropertyChanged functionality

    public static void Set<T>(object owner, string propName, ref T oldValue, T newValue,
        PropertyChangedEventHandler eventHandler)
    {
        // make sure the property name really exists
        if (owner.GetType().GetProperty(propName) == null)
        {
            throw new ArgumentException("No property named ‘" +
                propName + "‘ on " + owner.GetType().FullName);
        }

        // we only raise an event if the value has changed
        if (Equals(oldValue, newValue)) return;
        oldValue = newValue;
        if (eventHandler != null)
        {
            eventHandler(owner, new PropertyChangedEventArgs(propName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void notifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    #endregion INotifyPropertyChanged functionality
}

Этот класс скомпилирован в отдельную сборку. Затем я добавляю его в свой конструктор MainWindow следующим образом [править]

    public MainWindow()
    {
        initializeAttributes();
        InitializeComponent();
        CurrentConfig = new Configuration
        {
            IsToolTips = true
        };
        DataContext = CurrentConfig;
        composeModules();
    }

[конец редактирования] и в моем XMAL у меня есть это [править]

<MenuItem Name="ToolTips"
    Header="Tool Tips"
    IsCheckable="True"
    IsChecked="{Binding Source=CurrentConfig,
                        Path=IsToolTips,
                        Mode=TwoWay}"
    Click="onToolTipsClick">
</MenuItem>

[конец редактирования] Проблема в том, что член «PropertyChanged» моего класса конфигурации всегда имеет значение null. Куда я иду не так?

Ответы [ 3 ]

3 голосов
/ 23 января 2012

Проблема в том, что вы инициализируете CurrentConfig слишком поздно:

// Setting data context here...
DataContext = CurrentConfig;
InitializeComponent();

// This makes a new instance, but does not update the data context!
CurrentConfig = new Configuration
    {
        IsToolTips = true
    };

Я подозреваю, что вы хотите изменить это примерно так:

InitializeComponent();    
CurrentConfig = new Configuration
    {
        IsToolTips = true
    };

// Set this AFTER you construct your CurrentConfig
DataContext = CurrentConfig;

Кроме того, ваша привязкаустановить с помощью Source=CurrentConfiguration, но ваше имя свойства выглядит как CurrentConfig.Возможно, вам придется настроить контекст данных или путь привязки.Если DataContext установлен как отображаемый, вы, вероятно, можете удалить источник, так как вы хотите, чтобы привязка связывалась сама с собой.

2 голосов
/ 23 января 2012

Source=CurrentConfiguration устанавливает Source в строку "CurrentConfiguration", которая, очевидно, не будет иметь этого свойства.

Отладка привязки и см. Ссылки если вы недостаточно о них знаете.

0 голосов
/ 23 января 2012

Убрать нулевую проверку. Когда вы обычно внедряете INotifyProperty, вы не проверяете его.

public string _PhoneNumber
public string PhoneNumber
{
    get
    {
        return _PhoneNumber;
    }

    set
    {
        if (value != PhoneNumber)
        {
            _PhoneNumber = value;
            NotifyPropertyChanged("PhoneNumber");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...