InvalidOperationException When Expanding Tree Nodes.

4 posts, 0 answers
  1. Don
    Don avatar
    31 posts
    Member since:
    Aug 2012

    Posted 02 Oct 2012 Link to this post


    I'm using the tree control from C#.  Our application can fill the tree with a lot of data. Every time a user either expands an individual tree node or initiates the expand all nodes call, if any column is set to be sorted, an InvalidOperationException is thrown when Telerik's internal code is calling the "get" method of the "Column" property in the Telerik.Windows.Controls.GridView.ColumnSortDescriptor class.

    The the VS debugger flags the exception in the file "c:\RadControlsSource\Controls\GridView\GridView\GridView\Sorting\ColumnSortDescriptor.cs", line 38.

    Here's the exception information:

    System.InvalidOperationException was unhandled by user code
      Message="The calling thread cannot access this object because a different thread owns it."
      Source="WindowsBase"
      StackTrace:
           at System.Windows.Threading.Dispatcher.VerifyAccess()
           at System.Windows.Threading.DispatcherObject.VerifyAccess()
           at System.Windows.DependencyObject.GetValue(DependencyProperty dp)
           at Telerik.Windows.Controls.GridView.ColumnSortDescriptor.get_Column()
           at Telerik.Windows.Controls.GridView.ColumnSortDescriptor.CreateSortKeyExpression(ParameterExpression parameterExpression)
           at Telerik.Windows.Data.SortDescriptorBase.CreateSortKeyExpression(Expression itemExpression)
           at Telerik.Windows.Data.Expressions.SortDescriptorCollectionExpressionBuilder.Sort()
           at Telerik.Windows.Data.QueryableExtensions.Sort(IQueryable source, IEnumerable`1 sortDescriptors)
           at Telerik.Windows.Data.QueryableExtensions.Sort(IQueryable source, SortDescriptorCollection sortDescriptors)
           at Telerik.Windows.Data.HierarchicalCollectionViewBase.get_BaseView()
           at Telerik.Windows.Data.HierarchicalCollectionViewBase.CreateHierachyView(HierarchicalCollectionViewBase view)
           at Telerik.Windows.Data.HierarchyItem.get_Children()
           at Telerik.Windows.Data.HierarchicalCollectionViewBase.<CreateView>b__23(HierarchyItem h)
           at Telerik.Windows.Data.EnumerableExtensions.<SelectRecursive>d__3`1.MoveNext()
           at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
           at Telerik.Windows.Data.HierarchicalCollectionViewBase.PopulateInternalList(IQueryable view)
           at Telerik.Windows.Data.HierarchicalCollectionViewBase.<>c__DisplayClass32.<CreateInternalList>b__2e(Object s, DoWorkEventArgs e)
           at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
           at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
      InnerException:

    I am accessing the TreeListView control from the main UI thread. When this exception happens, the state of the tree control is hosed and our Windows desktop application must be restarted. Can anyone give me a clue as to how I can avoid this problem?  Thanks.
  2. Don
    Don avatar
    31 posts
    Member since:
    Aug 2012

    Posted 02 Oct 2012 Link to this post

    FYI - Here's how the TreeLIstView control is defined in our XAML file:

    <telerik:RadTreeListView
        Name="JobTreeListView"
        AutoGenerateColumns="False"
        HierarchyColumnIndex="0"
        ItemsSource="{Binding RunningWorkflowDataModelView}"
        FontSize="10"
        Foreground="White"
        GridLinesVisibility="None"
        telerik:StyleManager.Theme="Expression_Dark"
        VerticalAlignment="Stretch"
        HorizontalAlignment="Stretch"
        Grid.Row="0"
        VirtualizingStackPanel.IsVirtualizing="True"
        VirtualizingStackPanel.VirtualizationMode="Recycling"
        CanUserSortColumns="True"
        RowHeight="18"
        IsReadOnly="True"
        RowIndicatorVisibility="Collapsed"
        RowDetailsVisibilityMode="Collapsed"
        IsFilteringAllowed="False"
        SelectionMode="Extended"
        SelectionUnit="FullRow"
        DataLoaded="JobTreeListView_DataLoaded"
        DataLoadMode="Asynchronous"
        CanUserFreezeColumns="False"
        >
     
        <telerik:RadTreeListView.Resources>
            <Style TargetType="{x:Type telerik:TreeListViewRow}">
                <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
            </Style>
     
            <DataTemplate DataType="{x:Type s:ProgressObjectRunning}">
                <StackPanel>
                    <ProgressBar Margin="1" Visibility="{Binding DataModel.VisibleIfRunning}">
                        <ProgressBar.Value>
                            <Binding Path="DataModel.Progress" Mode="OneWay"/>
                        </ProgressBar.Value>
                        <ProgressBar.Foreground>
                            <Binding Path="DataModel.ProgressColor" Mode="OneWay"/>
                        </ProgressBar.Foreground>
                    </ProgressBar>
                    <TextBlock Text="{Binding DataModel.StatusMessage}" Visibility="{Binding DataModel.VisibleIfPaused}" />
                </StackPanel>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:ProgressObjectSuccess}">
                <StackPanel Orientation="Horizontal">
                    <Button Margin="0,0,2,0" Style="{StaticResource StatusGreenStyle}"></Button>
                    <TextBlock Text="{Binding DataModel.StatusMessage}"></TextBlock>
                </StackPanel>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:ProgressObjectFailed}">
                <StackPanel Orientation="Horizontal">
                    <Button Margin="0,0,2,0" Style="{StaticResource StatusRedStyle}"></Button>
                    <TextBlock Text="{Binding DataModel.StatusMessage}"></TextBlock>
                </StackPanel>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:ProgressObjectPending}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding DataModel.StatusMessage}"></TextBlock>
                </StackPanel>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:ProgressObjectNotExecuted}">
                <StackPanel Orientation="Horizontal">
                    <Button Margin="0,0,2,0" Style="{StaticResource StatusYellowStyle}"></Button>
                    <TextBlock Text="{Binding DataModel.StatusMessage}"></TextBlock>
                </StackPanel>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:RunningWorkflowModel}">
                <Label Content="{Binding TargetFile}"/>
            </DataTemplate>
     
            <DataTemplate DataType="{x:Type s:NewJobDataModel}">
                <Label Content="{Binding TaskType}"/>
            </DataTemplate>
     
        </telerik:RadTreeListView.Resources>
     
        <telerik:RadTreeListView.ContextMenu>
            <ContextMenu>
                <MenuItem
                    Header="{l:Translate MenuItem.ExpandAllItems}"
                    Command="{Binding ExpandAllItemsCommand.Command}"
                    />
                <MenuItem
                    Header="{l:Translate MenuItem.CollapseAllItems}"
                    Command="{Binding CollapseAllItemsCommand.Command}"
                    />
                <Separator />
                <MenuItem
                        x:Name="ResumeJobMenuItem"
                        Header="{l:Translate MenuItem.ResumeJob}"
                        Command="{Binding ResumeJobCommand.Command}"
                        />
                <MenuItem
                        x:Name="PauseJobMenuItem"
                        Header="{l:Translate MenuItem.PauseJob}"
                        Command="{Binding PauseJobCommand.Command}"
                        />
                <MenuItem
                        x:Name="StopJobMenuItem"
                        Header="{l:Translate MenuItem.StopJob}"
                        Command="{Binding StopJobCommand.Command}"
                        />
                <!--<MenuItem
                        x:Name="RequeueJobMenuItem"
                        Header="{l:Translate MenuItem.RequeueJob}"
                        Command="{Binding RequeueJobCommand.Command}"
                        />-->
            </ContextMenu>
        </telerik:RadTreeListView.ContextMenu>
     
        <telerik:RadTreeListView.Columns>
     
            <telerik:GridViewDataColumn
                x:Name="JobGridViewColumn"
                IsSortable="True"
                SortingState="Ascending"
                IsCustomSortingEnabled="False"
                SortMemberPath="TargetFile"
                DataMemberBinding="{Binding TargetFile}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Job}" ToolTipService.ToolTip="{l:Translate ToolTip.JobGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="TaskNameGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding TaskName}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.TaskName}" ToolTipService.ToolTip="{l:Translate ToolTip.TaskNameGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding TaskName}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="JobProgressGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding Progress}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.JobProgress}" ToolTipService.ToolTip="{l:Translate ToolTip.JobProgressGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <ContentPresenter Margin="1" Content="{Binding ProgressObject}"/>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="TreeViewPriorityGridViewColumn"
                Width="120"
                IsResizable="True"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                SortMemberPath="PrioritySortValue"
                DataMemberBinding="{Binding Priority}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Priority}" ToolTipService.ToolTip="{l:Translate ToolTip.TreeViewPriorityGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <em:PrioritySlider
                            x:Name="WorkflowPrioritySlider"
                            OnNewSliderValueReady="PrioritySlider_NewValueReady"
                            />
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="CurrentTimeGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding CurrentTime}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.CurrentTime}" ToolTipService.ToolTip="{l:Translate ToolTip.CurrentTimeGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding CurrentTime}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="MediaDurationGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding Duration}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.MediaDuration}" ToolTipService.ToolTip="{l:Translate ToolTip.MediaDurationGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding Duration}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="PassGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding MultipassPass}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Pass}" ToolTipService.ToolTip="{l:Translate ToolTip.PassGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding MultipassPass}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="StartTimeGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding StartTime, Converter={StaticResource dateConverter}}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.StartTime}" ToolTipService.ToolTip="{l:Translate ToolTip.StartTimeGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding StartTime, Converter={StaticResource dateConverter}}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="EndTimeGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding CompletedTime, Converter={StaticResource dateConverter}}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.EndTime}" ToolTipService.ToolTip="{l:Translate ToolTip.EndTimeGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding CompletedTime, Converter={StaticResource dateConverter}}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="AttemptGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding Attempt}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Attempt}" ToolTipService.ToolTip="{l:Translate ToolTip.AttemptGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding Attempt}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="MachineGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding NodeName}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Machine}" ToolTipService.ToolTip="{l:Translate ToolTip.MachineGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding NodeName}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
     
            <telerik:GridViewDataColumn
                x:Name="SubmitterGridViewColumn"
                IsSortable="True"
                SortingState="None"
                IsCustomSortingEnabled="False"
                DataMemberBinding="{Binding SubmitterClient}">
                <telerik:GridViewDataColumn.Header>
                    <TextBlock Text="{l:Translate GridViewColumn.Submitter}" ToolTipService.ToolTip="{l:Translate ToolTip.SubmitterGridViewColumn}" />
                </telerik:GridViewDataColumn.Header>
                <telerik:GridViewDataColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding SubmitterClient}" />
                        </StackPanel>
                    </DataTemplate>
                </telerik:GridViewDataColumn.CellTemplate>
            </telerik:GridViewDataColumn>
        </telerik:RadTreeListView.Columns>
     
        <telerik:RadTreeListView.ChildTableDefinitions>
            <telerik:TreeListViewTableDefinition ItemsSource="{Binding Children}" />
        </telerik:RadTreeListView.ChildTableDefinitions>
     
    </telerik:RadTreeListView>
  3. UI for WPF is Visual Studio 2017 Ready
  4. Vlad
    Admin
    Vlad avatar
    11100 posts

    Posted 03 Oct 2012 Link to this post

    Hi,

    Please remove DataLoadMode="Asynchronous" to avoid this. 

    Kind regards,
    Vlad
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  5. Don
    Don avatar
    31 posts
    Member since:
    Aug 2012

    Posted 03 Oct 2012 Link to this post

    That did the trick. Thanks, Vlad! :)
Back to Top