C# 将打开的泛型委托作为回调传递

C# 将打开的泛型委托作为回调传递,c#,wpf,generics,C#,Wpf,Generics,可能我在搜索一些错误的关键字,但是我找不到关于这个问题的任何东西:我正在修补WPF MVVM,现在我要说的是,我正在寻找一种解决方案,使ViewModel能够请求容器更改为另一个ViewModel。 我的方法是将回调传递给创建的ViewModel,它保存在抽象基类上,如果需要,可以调用。容器中的方法如下所示: private void ApplyViewModel<T>() where T : ViewModelBase { _exHa

可能我在搜索一些错误的关键字,但是我找不到关于这个问题的任何东西:我正在修补WPF MVVM,现在我要说的是,我正在寻找一种解决方案,使ViewModel能够请求容器更改为另一个ViewModel。 我的方法是将回调传递给创建的ViewModel,它保存在抽象基类上,如果需要,可以调用。容器中的方法如下所示:

    private void ApplyViewModel<T>()
        where T : ViewModelBase
    {
        _exHandler.HandledAction(
            () =>
            {
                var vm = _viewModelFactory.CreateViewModel<T>();
                vm.ApplyViewModel = ApplyViewModel<T>;
                CurrentContent = vm;
            });
    }
public ApplyViewModelDelegate<ViewModelBase> SwitchToViewModel { get; set; } 
    public ViewModelCommand ToTest2
    {
        get
        {
            return new ViewModelCommand(
                "To Test2",
                new ActionCommand(() =>
                {
                    SwitchToViewModel<Test2ViewModel>();
                }));
        }
    }
private void ApplyViewModel()
其中T:ViewModelBase
{
_呼气手(
() =>
{
var vm=_viewModelFactory.CreateViewModel();
vm.ApplyViewModel=ApplyViewModel;
CurrentContent=vm;
});
}
有趣的是第二行,我将方法本身传递给ViewModel。 为此,我还创建了一个代表:

public delegate void ApplyViewModelDelegate<T>()
    where T : ViewModelBase; 
public委托无效applyviewmodellegate()
其中T:ViewModelBase;
现在问题在于ViewModelBase中回调的定义:似乎不可能将其定义为打开的泛型委托。因此,我想创建一个具有以下签名的属性:

public ApplyViewModelDelegate<T> ApplyViewModel { get; set; }
public applyviewmodellegate ApplyViewModel{get;set;}
在我真正想用特定类型调用委托之前,是否有可能将委托作为开放泛型类型传递

编辑: 如果我这样定义属性:

    private void ApplyViewModel<T>()
        where T : ViewModelBase
    {
        _exHandler.HandledAction(
            () =>
            {
                var vm = _viewModelFactory.CreateViewModel<T>();
                vm.ApplyViewModel = ApplyViewModel<T>;
                CurrentContent = vm;
            });
    }
public ApplyViewModelDelegate<ViewModelBase> SwitchToViewModel { get; set; } 
    public ViewModelCommand ToTest2
    {
        get
        {
            return new ViewModelCommand(
                "To Test2",
                new ActionCommand(() =>
                {
                    SwitchToViewModel<Test2ViewModel>();
                }));
        }
    }
public applyviewmodellegate SwitchToViewModel{get;set;}
我可以从容器中指定属性,但我的最终想法是调用此属性以针对特定的ViewModel。例如,命令可以如下所示:

    private void ApplyViewModel<T>()
        where T : ViewModelBase
    {
        _exHandler.HandledAction(
            () =>
            {
                var vm = _viewModelFactory.CreateViewModel<T>();
                vm.ApplyViewModel = ApplyViewModel<T>;
                CurrentContent = vm;
            });
    }
public ApplyViewModelDelegate<ViewModelBase> SwitchToViewModel { get; set; } 
    public ViewModelCommand ToTest2
    {
        get
        {
            return new ViewModelCommand(
                "To Test2",
                new ActionCommand(() =>
                {
                    SwitchToViewModel<Test2ViewModel>();
                }));
        }
    }
public viewmodel命令ToTest2
{
得到
{
返回新的viewmodel命令(
“测试2”,
新建ActionCommand(()=>
{
切换到视图模型();
}));
}
}

为什么不将属性声明为ApplyViewModelLegate?嗯,您能详细说明一下您的意思吗?将属性声明为公共ApplyViewModelLegate ApplyViewModelHandler{get;set;}。然后,您可以将对ApplyViewModel方法的引用分配给此属性。我可以分配它,但我希望使用特定的ViewModel调用它,而不是基本的ViewModel。我编辑以显示我的意思。