我遇到了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);
}
}
我不知道出了什么问题
答案 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;通知程序。