wpf 值不能为空,参数名:键(仅发生在XAML设计器的设计视图中)

kpbwa7wx  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(571)

XAML设计器设计视图显示
引发了异常
参数为空异常:值不能为空。
参数名称:键

StackTrace(见后图)

内部异常:无

几天来,我一直在为以下问题而苦恼,它使我无法在每个受影响的视图上使用XAML Designer的设计视图。
昨天,我终于设法隔离了这种奇怪的行为,它特别难以跟踪,因为它只发生在设计时,这似乎是泛型类型和DataGrid的ItemsSource属性(System.Windows.Controls)之间的冲突。
这就是设计视图上显示的内容

在系统.集合.通用.字典2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.TryGetValue系统.窗口.控件.数据网格项附加存储.TryGetValue中的(TKey键、TValue和值)(对象项目、相依性属性属性、对象值)(& V)位于系统. windows .控件.数据格列.还原附加项目值在系统.窗口.控件.数据网格行.同步属性中的(具有属性的依赖对象对象,依赖属性属性)(布尔值forcePrepareCells)位于系统.窗口.控件.数据网格行.准备行(对象项,拥有数据网格的数据网格)位于系统.窗口.控件.数据网格.PrepareContainerForItemOverride(相依性对象元素,对象项目)位于系统. windows .控件.项目控件.MS.内部.控件.IGeneratorHost.PrepareItemContainer(依赖对象容器,系统.窗口.控件.项目容器生成器.系统.窗口.控件.基元.项目容器生成器.准备项目容器(依赖对象容器)在系统.窗口.控件.虚拟化堆栈面板.插入容器(Int32子索引,UIElement容器,布尔值为Recycled)在系统.窗口.控件.虚拟化堆栈面板.从生成器添加容器(Int32子索引,UIElement子索引,布尔值新实现,布尔值为Viewport之前)在系统.窗口.控件.虚拟化堆栈面板.测量子索引(II项容器生成器&生成器,I项容器存储&项存储提供器,I项容器存储&父项存储提供器,对象&父项,布尔值&具有统一或平均容器大小被设置,双精度值&计算统一或平均容器大小,双精度计算统一或平均容器像素大小(& C),布尔值计算区域容器统一大小(& C),IList项目(& I),对象项目(& I),IList子级(& I),Int32子级索引(& I),布尔值visualOrderChanged(& I),布尔值为水平(& I),大小子级约束(& I),矩形(& V),虚拟化缓存长度(& I),虚拟化缓存长度单位(& I),缓存单位(& I),布尔值&发现视口中的第一项,双精度&视口中的第一项偏移,大小与堆栈像素大小,大小与堆栈视口中的像素大小,大小与堆栈视口前缓存中的像素大小,大小与堆栈视口后缓存中的像素大小,大小与堆栈逻辑大小,大小与堆栈视口中的逻辑大小,大小与堆栈视口前缓存中的逻辑大小,大小与堆栈视口后缓存中的逻辑大小,大小与堆栈视口后缓存中的逻辑大小,布尔值& mustDisableVirtualization,布尔值为第一项前,布尔值为第一项后,布尔值为AfterLastItem,布尔值跳过实际测量,布尔值跳过生成,布尔值&具有带入视图容器已测量,布尔值&具有虚拟化子项)位于系统.窗口.控件.虚拟化堆栈面板.测量覆盖实现(大小约束,可为空的1& lastPageSafeOffset, List 1和先前测量的偏移量,可为空的'1和最后页面像素大小,布尔重新测量)在系统.窗口.控件.虚拟化堆栈面板.测量覆盖(大小约束)位于系统.窗口.控件.基元.数据网格行演示器.度量覆盖(大小约束)位于系统.窗口.框架元素.测量核心(可用大小大小)在系统.窗口. UI元素.测量(可用大小大小)在系统.Windows.上下文布局管理器.更新布局()在系统.Windows. UI元素.更新布局()
Sample project source code

MyViewModelbase.cs(这是我通用视图模型库)

namespace BugProof.ViewModels
{
    using System.Collections.Generic;

    public class MyViewModelBase<TItem> where TItem : class
    {
        public List<TItem> Items { get; set; }
        public MyViewModelBase() { }
    }
}

MyExtendedViewModel.cs(这是我的扩充检视模型,它将以string型别为基础)

namespace BugProof.ViewModels
{
    public class MyExtendedViewModel : MyViewModelBase<string>
    {
        public MyExtendedViewModel()
        {
        }
    }
}

主窗口.xaml

<Window x:Class="BugProof.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:BugProof.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BugProof"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance {x:Type vm:MyExtendedViewModel}, IsDesignTimeCreatable=False}"                  
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock>This is what you should se in the designer</TextBlock>
        <!--Try replacing following DataGrid by a ListBox or ListView-->
        <DataGrid ItemsSource="{Binding Items}"/>
    </StackPanel>
</Window>

MainWindow.xaml.cs(主窗口代码隐藏)

using System.Windows;

namespace BugProof
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

补充细节:

  • 如果将DataGrid控件替换为列表框列表视图ItemsControl,则不会出现此行为
  • 我正在使用Visual Studio 2015版本14.0.25431.01更新3
  • 项目针对**.Net Framework 4.5**
wn9m85ua

wn9m85ua1#

MainWindows.xaml上设置IsDesignTimeCreatable=True可以解决这个问题,尽管在实现视图模型的无参数构造函数时需要特别小心,检查代码是否在设计时运行。
According to Microsoft,设置IsDesignTimeCreatable=True“,指定从您得类型创建设计示例,而不是从设计器生成得替换类型”.“
令人惊讶的是,同样根据Microsoft的说法,如果IsDesignTimeCreatable未设置或设置为False,“设计工具所做的一切就是解析类的可绑定属性”。
我猜我们得到了两个相反的事实。根据上下文,这甚至可能是两个都真的为真的情况。在编写文档时,第二个源可能不知道XAML设计器在找到集合(IEnumerable)属性时,一旦IsDesignTimeCreatable设置为默认的False值,就自动生成3个示例
除非另有证明,否则当ItemsSource系结至泛型集合来源且IsDesignTimeCreatable=False时,这是WPF DataGrid控件错误,因为如果我们以ListBoxListViewItemsControls取代DataGrid控件,就不会发生这个问题。

jk9hmnmh

jk9hmnmh2#

已使用以下内容修复此问题:
1.增加了设计宽度
1.将设计宽度恢复为原始值。
仅供参考我使用的是Visual Studio 2019。

oug3syen

oug3syen3#

另一个解决方案是简单地删除“d:DataContext”属性,该属性将禁用与数据上下文相关的自动完成。
由于Julio建议的“IsDesignTimeCreatable”属性对我不起作用,我不得不使用此解决方案:/

emeijp43

emeijp434#

只需在XAML代码中添加以下行

d:DataContext=""

相关问题