PropertyChanged事件未正确处理

时间:2013-07-21 15:23:04

标签: c# visual-studio-2010 mvvm inotifypropertychanged

我正在尝试让我的属性更改事件处理程序工作,并且我已经使用dubugger检查了正在调用的OnPropertyChanged方法,但是它没有像我期望的那样调用该方法。

public class MainViewModel : ObservableObject
{
    public MainViewModel()
    {
        _characterSelection = new CharacterSelectionViewModel();
        _characterSelection.PropertyChanged += new PropertyChangedEventHandler(characterSelection_PropertyChanged);
    }

    private void characterSelection_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName.Equals("Character"))
        {
            _character = _characterSelection.Character;
            _currentView = _newCharacter;
            OnPropertyChanged("CurrentView");
        }
    }
}

[Serializable]
public class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string property)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(property));
        }
    }
}

public class CharacterSelectionViewModel : ObservableObject
{
    private void newCharacter()
    {
        CharacterSaver.SaveCharacter(CharacterName, _character);
        OnPropertyChanged("Character");
    }
}

我已使用调试器完成此操作,MainViewModel()的构造函数被调用,并添加PropertyChangedEventHandler。 此时,_characterSelection's PropertyChanged事件具有以下值:(来自调试器中的locals选项卡)

{Method = {Void characterSelection_PropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}

调用newCharacter中的CharacterSelectionViewModel方法后,会调用OnPropertyChanged。 此时,_characterSelection's PropertyChanged事件具有此值:

{Method = {Void OnPropertyChanged(System.Object, System.ComponentModel.PropertyChangedEventArgs)}}

OnPropertyChanged事件会转到handler(this, new PropertyChangedEventArgs(property));行,但永远不会调用characterSelection_PropertyChanged()。没有错误。

我错过了什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您可以设置绑定,以便在CharacterSelectionViewModel上使用单独的MainViewModel实例,而不是MainViewModel上的实例。检查您的绑定,以确保您已正确绑定到CharacterSelectionViewModel,并且您正在使用ICommand的{​​{1}}实例来确保您所遇到的事件正确提出订阅(在正确的实例上)。