C# 通用参数约束冲突?

C# 通用参数约束冲突?,c#,wpf,xaml,C#,Wpf,Xaml,我声明了一个基本对话框窗口类,该类键入datacontext,以确保附加的viewmodel具有适当的返回类型。当我尝试使用它时,尽管我得到了一个通用参数错误: 一般论据[1], “Mocks.MidSoft_Hospitality_ViewModels_Dialogs_ReceiveItemViewModel_32_569724456”, 在…上 'Mocks.MidSoft\u Hospitality\u view\u Dialogs\u BaseDialogWindow'2\u 32\u

我声明了一个基本对话框窗口类,该类键入datacontext,以确保附加的viewmodel具有适当的返回类型。当我尝试使用它时,尽管我得到了一个通用参数错误:

一般论据[1], “Mocks.MidSoft_Hospitality_ViewModels_Dialogs_ReceiveItemViewModel_32_569724456”, 在…上 'Mocks.MidSoft\u Hospitality\u view\u Dialogs\u BaseDialogWindow'2\u 32\u 569724456[TResult,TViewModel]' 违反类型为“TViewModel”的约束

我不明白为什么会这样

基本对话框窗口声明:

public class BaseDialogWindow<TResult, TViewModel> : DialogWindowBase<TResult> where TViewModel: ViewModels.Dialogs.DialogBaseViewModel<TResult>
{
    public BaseDialogWindow() : base()
    {

    }

    new public TViewModel DataContext
    {
        get => this.GetValue(DataContextProperty) as TViewModel;
        set => this.SetValue(DataContextProperty, value);
    }

}
我上面提到的错误是我得到的唯一编译器错误。如果能深入了解这一错误,我将不胜感激


更新:我现在注意到,应用程序正在编译和运行,没有抛出任何异常,但错误仍然存在,xaml设计器将其显示为无效标记

isdesigntimecreateable=False
将迫使设计器忽略指定的
设计实例
类型并创建替换使用反射输入。在这种情况下,设计器无法识别泛型类型,因为它是复杂类型而不是基元类型,因此无法使用正确的泛型参数
TViewModel
创建正确的模拟实例


要解决此问题,可以将
isdesigntimecreateable
属性设置为
True
,并在
ReceiveItemViewModel
上实现默认构造函数。如果无法使用默认构造函数,请仅为设计时
DesignInstance
引入包装器类型,并将其用作默认构造函数,以正确初始化基本类型
ReceiveItemViewModel

为什么需要重写
DataContext
并将其设置为class,它继承了
窗口
IsDesignTimeCreatable=False
将强制设计器忽略指定的
设计实例
类型,并使用反射创建替代类型。它无法识别泛型类型,因为它是复杂类型而不是基元类型,因此无法使用正确的泛型参数
TViewModel
创建正确的模拟实例。您可以将
isdesigntimecreateable
属性设置为
True
,并在上实现默认构造函数
ReceiveItemViewModel
或者如果无法使用默认构造函数,仅为设计时
DesignInstance
引入包装器类型,并将其作为默认构造函数,正确初始化基类型
ReceiveItemViewModel
。@BionicCode我按建议添加默认构造函数,并将IsDesignTimeCreatable设置为true,但错误仍然存在persists@PavelAnikhouski凌驾于datacontext纯粹是为了确保viewmodel符合returntype上的约束。它被重写到的类不继承窗口
public class DialogWindowBase<TResult> : Window, IDialog<TResult>
{
    public DialogWindowBase()
    {
        //Formatting code here
    }

    public Result Result { get; set; } = Result.None;

    public TResult ReturnData { get; set; }

}
public class ReceiveItemViewModel : ViewModels.Dialogs.DialogBaseViewModel<ReceiveItemResult>
{
    //View Model Code here
}
<local:BaseDialogWindow x:Class="MidSoft.Hospitality.Views.Dialogs.ReceiveItemDialog"
                        x:TypeArguments="local:ReceiveItemResult, vm:ReceiveItemViewModel"
                        xmlns:vm="clr-namespace:MidSoft.Hospitality.ViewModels.Dialogs"
                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                        xmlns:local="clr-namespace:MidSoft.Hospitality.Views.Dialogs"
                        mc:Ignorable="d"
                        d:DataContext="{d:DesignInstance vm:ReceiveItemViewModel, IsDesignTimeCreatable=False}"
                        x:Name="ReceiveStockItemDialog"
                        Height="450" Width="800">
    <Grid>
    </Grid>
</local:BaseDialogWindow>
    public partial class ReceiveItemDialog
    {
        public ReceiveItemDialog()
        {
            InitializeComponent();
        }
    }