在我的MVVM应用程序中,我有MyViewModel
:
public class MyViewModel : ViewModelBase, IMyViewModel
{
public virtual RelayCommand MyCommand { get; set; }
}
扩展DerivedViewModel
的和MyViewModel
public class DerivedViewModel : MyViewModel
{
private RelayCommand _myCommand;
public override RelayCommand MyCommand
{
get
{
if (_myCommand == null)
{
_myCommand = new RelayCommand(some implementation...)
}
return _myCommand;
}
}
}
两个视图模型都实现了接口IMyViewModel
public interface IMyViewModel
{
RelayCommand MyCommand { get; set; }
}
现在在我的视图中我将DerivedViewModel作为DataContext提供,而在MouseDoubleClick事件中,我正在尝试将我的DataContext转换为IMyViewModel来调用我的命令:
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (((FrameworkElement)e.OriginalSource).DataContext != null)
{
IMyViewModel viewModel = this.DataContext as IMyViewModel;
if (viewModel != null)
{
viewModel.MyCommand.Execute(((FrameworkElement)e.OriginalSource).DataContext);
}
}
}
但是,当我尝试执行命令时,它无法找到命令的派生实现并抛出ObjecNullReference Exception。
我尝试调试,我可以确认DataContext的类型为DerivedViewModel
。
不确定我在继承/转换方面缺少什么。
问题是它永远不会转换为派生类...只假设它是MyViewModel
答案 0 :(得分:0)
我不确定DataContext是如何实例化的,但是你有两个不同的实例。
您将从活动中获得第一名。
if (((FrameworkElement)e.OriginalSource).DataContext != null)
然后,您将从本地DataContext创建viewmodel。他们应该是相同还是不同?
IMyViewModel viewModel = this.DataContext as IMyViewModel;
如果你只有一个事件,那么下面是有道理的。
static void Main(string[] args)
{
if (((FrameworkElement)e.OriginalSource).DataContext != null)
{
IMyViewModel viewModel = ((FrameworkElement)e.OriginalSource).DataContext as IMyViewModel;
if (viewModel != null)
{
viewModel.MyCommand.Execute(viewModel);
}
}
}