我再次尝试使用 MVVM,目前我的代码遇到了两个问题。
首先让我解释一下代码结构:
我有这样的课程(当然是简化的):
public abstract class NavigationServiceBase : NotifyPropertyChangedBase, INavigationService
{
private IView _currentView;
public IView CurrentView
{
get { return _currentView; }
protected set
{
_currentView = value;
OnPropertyChanged("CurrentView");
}
}
public virtual void DoSomethingFancy()
{
CurrentView = ...; // here I expect it to fire OnPropertyChanged and notify my View
}
}
从这个基类继承的单例:
public class NavigationService : NavigationServiceBase
{
private static readonly INavigationService _instance = new NavigationService();
public static INavigationService Instance { get { return _instance; } }
...
}
视图模型:
private INavigationService _navigationService;
public IView CurrentView { get { return _navigationService.CurrentView; } }
public ICommand NavigateCommand { get; private set; }
public MainWindowViewModel()
{
_navigationService = NavigationService.Instance;
NavigateCommand = new RelayCommand(param => Navigate(param));
}
private void Navigate(object requestedPage)
{
_navigationService.Navigate((string)requestedPage);
//OnPropertyChanged("CurrentView"); // this works , but...
}
现在的问题:
1.) 我在 Visual Studio 2012 Express 中编辑 XAML。它似乎有效,但我收到一条带有此消息的警告:Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information.
它显示在我声明绑定 ViewModel 的资源时的部分。这是什么意思?如果我摆脱单例,消息就会消失。无论哪种方式,项目都可以正常编译和运行。
2.) 似乎我的 OnPropertyChanged("CurrentView") 没有触发或其他什么,因为我必须从 ViewModel 本身手动调用此方法。如果我从基类或继承单例中尝试它,它不起作用。(绑定只是忽略新值)。如果我在传递命令时手动执行此操作,它会起作用。是的,这只是额外的一行代码,但我想知道,有没有办法让它在没有这样“作弊”的情况下工作?