我有PropertyChanged
事件的问题,因为它总是空的,我一直试图设置DataContext的许多方式,但它总是为空,这里是一些代码:
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);
}
}
我不知道怎么了
我不知道你的PropertyChanged是哪个类声明的,但附加在INTERFACE引用上,所以。net的其余部分知道它可以使用它。
public class MainWindowViewModel : ViewModelBase, INotifyPropertyChanged
{
// then your declaration of the OnPropertyChanged...
}
仅仅公开事件并不意味着。net框架的其余部分都与它挂钩。您可能还必须确保视图中的属性通过绑定"连接"起来,例如在xaml…
中。<Label Content={Binding PropertyOnYourViewModel, NotifyOnSourceUpdated=True}" />
所以当"PropertyOnYourViewModel"被改变时,这个标签已经注册到"OnPropertyChanged"通知过程。
您指的是这段代码中的"处理程序"吗?
PropertyChangedEventHandler handler = this.PropertyChanged;
如果是这样,如果我的假设是正确的,它是你的ViewModelBase实现的一部分,请确保你也从INotifyPropertyChanged继承,并在你的CurrentPageViewModel属性的后续设置,你会注意到它将不再为空。