我一直有一个困扰我一段时间的问题,但我相信我终于找到了它。症状是当我的某个绑定属性触发DataTrigger
交换ContentTemplate
时,我的WPF控件无法正确呈现。堆栈跟踪:
System.ArgumentNullException: Value cannot be null.
Parameter name: d
at MS.Internal.Data.ElementObjectRef.GetObject(DependencyObject d, ObjectRefArgs args)
at MS.Internal.Data.ObjectRef.GetDataObject(DependencyObject d, ObjectRefArgs args)
at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.VerifySourceReference(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Run(Object arg)
at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
调试器完全没有帮助,因为它只是在application.Run()
上中断。这就是我在实际的xaml方面做的事情:
<CollectionViewSource x:Key="SomeCollectionView"
Source="{Binding StatsByUser}"
IsLiveSortingRequested="True">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Amount" Direction="Descending"/>
<scm:SortDescription PropertyName="Name" Direction="Ascending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<ItemsControl Background="Transparent" Width="{StaticResource Width}"
ItemsSource="{Binding Source={StaticResource SomeCollectionView}}">
<ItemsControl.Resources>
<DataTemplate x:Key="FullViewTemplate">
<Border Style="{StaticResource BorderStyle}">
<controls:FullCustomEntityControl CustomEntityObject="{Binding}"
Style="{StaticResource PanelStyle}"
MouseDown="Info_OnMouseDown"/>
</Border>
</DataTemplate>
<DataTemplate x:Key="CompactViewTemplate">
<Border Style="{StaticResource BorderStyle}">
<controls:CompactCustomEntityControl CustomEntityObject="{Binding}"
Style="{StaticResource PanelStyle}"
MouseDown="Info_OnMouseDown"/>
</Border>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource FullViewTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=c:ShellView}, Path=ViewModel.ShowCompactView}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource CompactViewTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
每当ViewModel.ShowCompactView
举起PropertyChanged
事件并启动DataTrigger
时,它就会切换ContentTemplate
,然后会抛出此错误。有没有办法解决这个或更好的方法来构建不会导致此问题的ContentTemplate
交换?
修改:可能相关的支持文章https://support.microsoft.com/en-us/kb/2461678
Edit2:UI的内容示例:。您可以看到大型广告位是FullCustomEntityControl
,小广告位是CompactCustomEntityControl
。将它们保留在任何模式而不更改它都不会导致任何问题,但是让数据触发器更改它们会导致这样的问题。此外,使用的控件应该是一致的,而不是在这里看起来像是分裂。通过将它们留在任一模式中,我的意思是只删除数据触发器并选择其中一个。
Edit3:与微软某人发生类似问题的帖子回复:https://social.msdn.microsoft.com/Forums/vstudio/en-US/fb4d0f41-bfea-409f-b8ac-e66558984b7a/argumentnullexception-when-displaying-wpf-window?forum=wpf
相关信息:
如果您在堆栈上获得带有VerifySourceReference的ArgumentNullException,它肯定是由Connect 561752中描述的问题引起的。即使您的应用程序没有直接使用ElementName绑定,它也可能间接使用它们 - 几个内置的 - 在控件中使用ElementName绑定:ComboBox,ContextMenu,MenuItem等
答案 0 :(得分:1)
每个ItemsControl都有 ItemTemplateSelector 属性,你可以帮忙解决这个问题。
答案 1 :(得分:1)
我不知道,我是否理解这个问题是错误的,但是当我将代码复制到我的解决方案时,它完美地工作了。以下是我的改变,
我做的一件事是,使用Path = DataContext.ShowCompactView替换Path = ViewModel.ShowCompactView,而relativesource是我的MainWindow,
<ItemsControl Background="Transparent"
ItemsSource="{Binding Source={StaticResource SomeCollectionView}}">
<ItemsControl.Resources>
<DataTemplate x:Key="FullViewTemplate">
<Border >
<Label Content="{Binding}"
/>
</Border>
</DataTemplate>
<DataTemplate x:Key="CompactViewTemplate">
<Border >
<Button Content="{Binding}"
/>
</Border>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource FullViewTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ShowCompactView}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource CompactViewTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 2 :(得分:1)
我用你的设置做了quick project,一切似乎都有效。错误似乎与CompactCustomEntityControl
/ FullCustomEntityControl
与PresentationCore交互的内容有关。
尝试在Debug-&gt;选项中启用.NET Framework源步骤以查看正在发生的事情: