MvvmLight EventToCommand для TreeView, выбрасывающий исключение NullReferenceException - PullRequest
8 голосов
/ 20 апреля 2011

Сначала код:

<UserControl x:Class="Engage.IWS.Modules.InteractionResults.Views.InteractionResultView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"

... more here that should be irrelevant ...

<TreeView
        x:Name="lstResults"
        Grid.Row="1"
        ItemsSource="{Binding Children}"
        >

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate
                ItemsSource="{Binding Children}" 
                DataType="{x:Type Models:InteractionResult}"
                >

                <StackPanel Orientation="Horizontal">
                    <TextBlock 
                        Text="{Binding Name}" 
                        />
                </StackPanel>

            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectedItemChanged">
                    <cmd:EventToCommand Command="{Binding ResultSelected, Mode=OneWay}"
                                    CommandParameter="{Binding ElementName=lstResults, Path=SelectedValue}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
    </TreeView>

Я использую MvvmLight и хочу вызвать Команду в ViewModel с выбранным в данный момент элементом в TreeView. Это все работало нормально, пока я не попытался добавить поведение EventToCommand.

Удаление всего внутри, включая блок <i:Interaction.Triggers>, предотвращает возникновение исключения NullReferenceException, но в этом случае у меня нет никаких действий при выборе элемента.

Чтобы было понятно, ошибка проявляется как XamlParseException, который содержит TargetInvocationException, который содержит NullReferenceException. Это первый раз, когда я пытался использовать EventToCommand.

Какова вероятная причина этого исключения и как его исправить?

Трассировка стека NullReferenceException:

   at System.Windows.Markup.ReflectionHelper.IsPublicType(Type type)
   at System.Windows.Markup.XamlTypeMapper.UpdateAttachedPropertyMethdodInfo(BamlAttributeInfoRecord attributeInfo, Boolean isSetter)
   at System.Windows.Markup.XamlTypeMapper.UpdateAttachedPropertyGetter(BamlAttributeInfoRecord attributeInfo)
   at System.Windows.Markup.PropertyDefinition.get_AttachedPropertyGetter()
   at System.Windows.Markup.BamlCollectionHolder.InitDefaultValue()
   at System.Windows.Markup.BamlCollectionHolder..ctor(BamlRecordReader reader, Object parent, Int16 attributeId, Boolean needDefault)
   at System.Windows.Markup.BamlRecordReader.ReadPropertyIListStartRecord(BamlPropertyIListStartRecord bamlPropertyIListStartRecord)
   at System.Windows.Markup.BamlRecordReader.ReadRecord(BamlRecord bamlRecord)
   at System.Windows.Markup.BamlRecordReader.Read(Boolean singleRecord)
   at System.Windows.Markup.TreeBuilderBamlTranslator.ParseFragment()
   at System.Windows.Markup.TreeBuilder.Parse()
   at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   at Engage.IWS.Modules.InteractionResults.Views.InteractionResultView.InitializeComponent() in c:\Users\admin\Documents\Visual Studio 2010\Projects\engage-iws-modules\Engage.IWS.Modules.InteractionResult\Views\InteractionResultView.xaml:line 1
   at Engage.IWS.Modules.InteractionResults.Views.InteractionResultView..ctor(IInteractionResultViewModel viewModel) in C:\Users\admin\Documents\Visual Studio 2010\Projects\engage-iws-modules\Engage.IWS.Modules.InteractionResult\Views\InteractionResultView.xaml.cs:line 14
   at Engage.IWS.Test.InteractionResults.FakeViewModel..ctor() in C:\Users\admin\Documents\Visual Studio 2010\Projects\engage-iws-modules\Engage.IWS.Modules.InteractionResult.Test.View\FakeViewModel.cs:line 17
   at Engage.IWS.Test.InteractionResults.MainWindow..ctor() in C:\Users\admin\Documents\Visual Studio 2010\Projects\engage-iws-modules\Engage.IWS.Modules.InteractionResult.Test.View\MainWindow.xaml.cs:line 13

1 Ответ

7 голосов
/ 20 апреля 2011

... я идиот.После того, как я прочитал трассировку стека, которую я разместил здесь, я понял, что проблема, вероятно, была в объявлении xmlns.Конечно же, я не добавлял сборки в качестве ссылок на проект.

У меня возникло желание просто удалить вопрос, но я делал что-то подобное раньше с WPF, когда в последний раз играл с ним (более года назад) и, надеюсь, моя глупость поможет кому-то еще со своими.

Как примечание, исключения, которые генерируются в таком случае, ужасны.Неужели так сложно создать исключение, в котором говорится, что «Пространство имен« я »не может быть загружено, вы пропустили ссылку?»?У меня даже был intellisense с использованием пространства имен <i:...>.

...