在 DataTemplate 中使用 Interaction.Triggers 仅在 Designer 中导致 XamlParseException
Using Interaction.Triggers in DataTemplate causing XamlParseException only in Designer
我有一个带有绑定对象列表的 ItemsSource:
<ItemsControl ItemsSource="{Binding Sprites}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Rectangle Fill="Black"
Width="{Binding Width}"
Height="{Binding Height}"/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<cmd:EventToCommand Command="{Binding MouseDownOnSpriteCommand}"
PassEventArgsToCommand="True"
EventArgsConverter="{StaticResource EventToEventCommandConverter}"
EventArgsConverterParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UIElement}, AncestorLevel=1}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在如您所见,我尝试为绑定项添加 DataTemplate,但这导致 Visual Studio Designer 向我抛出以下错误消息:
XamlParseException: Collection property 'System.Windows.Controls.Grid'.'Triggers' is null.
StackTrace:
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
at System.Windows.FrameworkElement.ApplyTemplate()
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Canvas.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.UIElement.UpdateLayout()
然而,我的代码编译得非常好,我可以 运行 并毫无问题地执行它。问题是,只要 DataTemplate 代码未被注释,Designer 只会向我显示错误消息。
我知道是 DataTemplate 引起了问题,因为当我将相同的网格硬编码到 ItemsControl 中然后使用 Interactions.Triggers 时,我可以绑定事件并且设计器中不会出现错误。 (但是我只能绑定到 MainViewModel 中的命令,而不能绑定到实际的项目列表)。
到目前为止,我已尝试将模板移动到单独的 ResourceDictionary 中,但这并没有改变任何东西。
我也知道有人以前有过相同的 。但是我使用的是 Visual Studio 2019,我已经更新到最新版本,但错误仍然出现。
所以我没有找到直接的解决方案,而是找到了解决方法。
需要注意的一件事是我使用
定义了 Window 的 DataContext
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
而且我相信这在某种程度上影响了错误。
经过测试,我发现如果我将 DataContext 的分配移动到代码后面,设计器就不会再显示错误并且工作正常。
所以基本上我用
public MainWindow() {
InitializeComponent();
MainViewModel vm = new MainViewModel();
DataContext = vm;
}
作为我后面代码的构造函数。
我有一个带有绑定对象列表的 ItemsSource:
<ItemsControl ItemsSource="{Binding Sprites}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Rectangle Fill="Black"
Width="{Binding Width}"
Height="{Binding Height}"/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<cmd:EventToCommand Command="{Binding MouseDownOnSpriteCommand}"
PassEventArgsToCommand="True"
EventArgsConverter="{StaticResource EventToEventCommandConverter}"
EventArgsConverterParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UIElement}, AncestorLevel=1}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
现在如您所见,我尝试为绑定项添加 DataTemplate,但这导致 Visual Studio Designer 向我抛出以下错误消息:
XamlParseException: Collection property 'System.Windows.Controls.Grid'.'Triggers' is null.
StackTrace:
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
at System.Windows.FrameworkElement.ApplyTemplate()
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Canvas.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.UIElement.UpdateLayout()
然而,我的代码编译得非常好,我可以 运行 并毫无问题地执行它。问题是,只要 DataTemplate 代码未被注释,Designer 只会向我显示错误消息。
我知道是 DataTemplate 引起了问题,因为当我将相同的网格硬编码到 ItemsControl 中然后使用 Interactions.Triggers 时,我可以绑定事件并且设计器中不会出现错误。 (但是我只能绑定到 MainViewModel 中的命令,而不能绑定到实际的项目列表)。
到目前为止,我已尝试将模板移动到单独的 ResourceDictionary 中,但这并没有改变任何东西。
我也知道有人以前有过相同的
所以我没有找到直接的解决方案,而是找到了解决方法。 需要注意的一件事是我使用
定义了 Window 的 DataContext<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
而且我相信这在某种程度上影响了错误。
经过测试,我发现如果我将 DataContext 的分配移动到代码后面,设计器就不会再显示错误并且工作正常。
所以基本上我用
public MainWindow() {
InitializeComponent();
MainViewModel vm = new MainViewModel();
DataContext = vm;
}
作为我后面代码的构造函数。