MvvmLight EventToCommand on a TreeView throwing NullReferenceException
Asked Answered
J

1

8

First, the code:

<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>

I'm using MvvmLight, and I want to call a Command on the ViewModel with the currently selected item within the TreeView. This was all working fine until I attempted to add the EventToCommand behaviour.

Removing everything within, and including, the <i:Interaction.Triggers> block prevents the NullReferenceException from occurring, but then I don't have any behaviour upon selecting an item.

To be clear, the error is manifesting itself as an XamlParseException, which contains a TargetInvocationException, which contains the NullReferenceException. This is the first time I've tried to use EventToCommand.

What is the likely cause of this exception, and how do I fix it?

The NullReferenceException stack trace is:

   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
Juxtapose answered 20/4, 2011 at 12:16 Comment(0)
J
7

... I am an idiot. After I read the stack trace I posted here, properly, I realised the problem was probably in the xmlns declaration. Sure enough, I hadn't re-added the assemblies as references to the project.

I was tempted to just delete the question, but I've done something similar before with WPF last time I played with it (over a year ago), and hopefully my stupidity will help someone else with their's.

<i:rant>

As a side note, the exceptions that are generated in such a case are terrible. Would it really be that difficult to raise an exception that said "Namespace 'i' could not be loaded, are you missing a reference?"? I even had intellisense using the <i:...> namespace.

</i:rant>

Juxtapose answered 20/4, 2011 at 12:28 Comment(3)
Did you check for an inner exception? Also, assembly loading exceptions ctor exceptions are always the hardest to debug because the exceptions are the least helpful...Ergosterol
I came into the same situation:) I think that exception could be more informative... And there is no InnerException at all...Giesser
Josh, you're not an idiot, this problem is not at all obvious. Thanks for not deleting you answer, it really helped me a lot. And I want to add my two cents: If you are using this is some class library, and then reference it in another project, that doesn`t have explicit reference to MVVM Light (or any other lib that is used ONLY via XAML). Then this lib will not be copied to target dir and you will have the same problem, or library load failure. So in this situations you will have to explicitly reference your dependency in your main project.Reathareave

© 2022 - 2024 — McMap. All rights reserved.