MVVM OnPropertyChanged不起作用

时间:2015-10-25 10:31:58

标签: c# wpf mvvm

我遇到了PropertyChanged事件的问题,因为它总是为null,我一直在尝试设置DataContext的方法很多,但它总是为null,这里有一些代码:

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

在App类中覆盖方法OnStartup

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        MainWindow window = new MainWindow();
        MainWindowViewModel mwvm = new MainWindowViewModel();
        window.DataContext = mwvm;
        window.Show();
    }



public class MainWindowViewModel : ViewModelBase
{
    private ICommand _ChangePageCommand;
    private IPageViewModel _CurrentPageViewModel;
    private List<IPageViewModel> _PageViewModels;
    public List<IPageViewModel> PageViewModels
    {
        get
        {
            if (_PageViewModels == null)
                _PageViewModels = new List<IPageViewModel>();
            return _PageViewModels;
        }
    }
    public IPageViewModel CurrentPageViewModel
    {
        get
        {
            return _CurrentPageViewModel;
        }
        set
        {
            if (_CurrentPageViewModel != value)
            {
                _CurrentPageViewModel = value;
                OnPropertyChanged("CurrentPageViewModel");
            }
        }
    }
    public ICommand ChangePageCommand
    {
        get
        {
            if (_ChangePageCommand == null)
            {
                _ChangePageCommand = new RelayCommand(
                                        p => ChangeViewModel((IPageViewModel)p),
                                        p => p is IPageViewModel);
            }
            return _ChangePageCommand;
        }
    }

    public MainWindowViewModel()
    {
        PageViewModels.Add(new FtpSettingsViewModel());

        CurrentPageViewModel = PageViewModels[0];
    }



    private void ChangeViewModel(IPageViewModel p)
    {
        if (!PageViewModels.Contains(p))
            PageViewModels.Add(p);

        CurrentPageViewModel = PageViewModels.FirstOrDefault(vm => vm == p);
    }
}

我不知道出了什么问题

2 个答案:

答案 0 :(得分:1)

您是指这段代码中的“处理程序”吗?

PropertyChangedEventHandler handler = this.PropertyChanged;

如果是这样,并且我的假设是正确的,它是ViewModelBase实现的一部分,请确保您也继承INotifyPropertyChanged,并且在您的CurrentPageViewModel属性的后续设置中,您将注意到它将不再为null。

答案 1 :(得分:1)

我不知道你的PropertyChanged被声明了哪个类,但是在INTERFACE引用上是如此,所以.net的其余部分知道它可以使用它..

public class MainWindowViewModel : ViewModelBase, INotifyPropertyChanged
{
   // then your declaration of the OnPropertyChanged...

}

暴露事件并不意味着.net框架的其余部分正在挂钩。您可能还必须确保视图中的属性已连接到&#34;通过绑定,例如在xaml ...

<Label Content={Binding PropertyOnYourViewModel, NotifyOnSourceUpdated=True}" />

所以&#34; PropertyOnYourViewModel&#34;得到改变,这个标签已经注册到&#34; OnPropertyChanged&#34;通知程序。