从DataContext转换为派生类

时间:2015-04-15 21:37:21

标签: c# wpf inheritance mvvm casting

在我的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

1 个答案:

答案 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);
                }
            }
        }