【问题标题】:PropertyChanged event not Handled properlyPropertyChanged 事件未正确处理
【发布时间】:2013-07-21 15:23:04
【问题描述】:

我正在尝试让我的属性更改事件处理程序正常工作,并且我已经使用调试器检查了 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)}}

一旦CharacterSelectionViewModel 中的newCharacter 方法被调用,它就会调用OnPropertyChanged。 此时_characterSelection's PropertyChanged事件有这个值:

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

OnPropertyChanged 事件到达handler(this, new PropertyChangedEventArgs(property)); 行,但从未调用characterSelection_PropertyChanged()。不会抛出任何错误。

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

【问题讨论】:

  • 我不确定,但您似乎在 添加处理程序之前引发了事件。这是不可能的。
  • 我刚刚运行了您的代码,并且引发了事件并在MainViewModel 中调用了处理程序就好了。你怎么打电话给newCharacter?我们需要更多信息来解决这个问题。
  • newCharacter 由按下按钮调用,使用 ICommand 调用。该处理程序是在页面初始化期间添加的。
  • 你是怎么装订的?我刚刚创建了一个虚拟 WPF 页面,MainViewModelDataContext,并在CharacterSelectionViewModel 上创建了一个命令。我将该命令绑定到一个按钮(我将_characterSelection 字段作为internal 属性公开,因此绑定为CharacterSelection.NewCharacterCommand),并且该命令调用newCharacter(),一切都按预期进行。
  • 谢谢!数据上下文是问题所在。我有: 在我的 CharacterSelectionView 文件中,因此它正在创建该类的单独实例。如果您将其作为答案,我会将其标记为正确。

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


【解决方案1】:

您可能已经设置了绑定,以便您拥有一个单独的 CharacterSelectionViewModel 实例,而不是 MainViewModel 上的实例。检查您的绑定以确保您已正确绑定到MainViewModel,并且您正在使用它的CharacterSelectionViewModel 实例进行ICommand 绑定,以确保您订阅的事件(在正确的instance) 被正确提升。

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多