Использование Interaction.Triggers в DataTemplate, вызывающее исключение XamlParseException только в конструкторе - PullRequest
0 голосов
/ 11 июля 2020

У меня есть 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 не закомментирован, конструктор показывает мне только сообщение об ошибке.

Я знаю, что DataTemplate вызывает проблему, потому что когда я жестко закодирую ту же сетку в ItemsControl и затем используйте Interactions.Triggers, я могу привязать событие, и в конструкторе не появится ошибка. (Однако я могу привязаться только к командам в MainViewModel, а не к фактическому списку элементов).

До сих пор я пытался переместить шаблон в отдельный ResourceDictionary, но это ничего не изменило. Также я знаю, что у кого-то раньше была такая же проблема . Однако я использую Visual Studio 2019, и я уже обновился до последней версии, и снова ошибка все еще появляется.

1 Ответ

0 голосов
/ 15 июля 2020

Итак, я не нашел прямого решения, но нашел обходной путь. Следует отметить, что я определил свой контекст данных окна с помощью

<Window.DataContext>
    <vm:MainViewModel/>
</Window.DataContext>

И я считаю, что это каким-то образом повлияло на ошибку. И после тестирования я обнаружил, что если я перенесу присвоение моего DataContext к коду позади, дизайнер больше не покажет ошибку и будет работать нормально. Поэтому в основном я использовал

public MainWindow() {
    InitializeComponent();
    MainViewModel vm = new MainViewModel();
    DataContext = vm;
}

в качестве конструктора для своего кода.

...