WPF: System.ArgumentException => {"'{0}' не является Visual или Visual3D."} - PullRequest
6 голосов
/ 04 марта 2010

когда я делаю , дважды щелкните - или щелкните один раз, когда он уже сфокусирован - под элементами в пустой области списка, который находится внутри моего DataGridTemplateColumn, тогда я получаю сообщение об ошибке выше.

Что я не прав?

Это мой код:

<DataGridTemplateColumn Width="0.3*" Header="Attachments">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <Button>Add</Button>
                <Button>Delete</Button>
                <ListBox Name="itemListBox" BorderThickness="0" ItemsSource="{Binding Attachments}" >                                   
                    <ListBox.ItemTemplate>
                        <DataTemplate>                                           
                            <StackPanel Orientation="Vertical" Margin="5">                                                
                                <TextBlock Text="{Binding DocumentFilename}" />
                            </StackPanel>                                            
                        </DataTemplate>
                    </ListBox.ItemTemplate>                                     
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> 

Обратите внимание на это изображение, где я нажимаю под записью элемента "myPhotos.png": alt text
(источник: 666kb.com )

РЕДАКТИРОВАТЬ : эта ошибка также уже видна в XAML через всплывающую подсказку, просто не видел эту подсказку об ошибке ...

Ответы [ 5 ]

8 голосов
/ 10 марта 2010

Это действительно похоже на ошибку.Я запустил ваш проект repro и проверил стек вызовов при возникновении исключения.Это происходит в DataGridCell.RemoveBindingExpressions во время вызова VisualTreeHelper.IsAncestorOf.Последний метод вызывает исключение, когда ему передается объект, который не является Visual или Visual3D.Но DataGridCell передает его любому элементу, являющемуся целью привязки.В вашем случае это Run, который не является производным от Visual.

Я подумал, что вы можете обойти его, используя IValueConverter для создания FlowDocument и привязки RichTextBox.Document, чтобыприменяется к RichTextBox.Но поскольку Document не является свойством зависимости, он не может быть целью привязки.

Поэтому вместо этого вы можете создать UserControl, в котором размещается элемент управления RichTextBox:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Local:HomeworkControl Text="{Binding Homework}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Затем в этом пользовательском элементе управления вы позаботитесь о создании RichTextBox, документа, запуска и т. Д. К сожалению, я думаю, что это всего лишь ограничение (или ошибка) в элементе управления DataGrid.

6 голосов
/ 19 октября 2012

Интересно, что это случилось и со мной. То, что сказал Джош, заставило меня задуматься. Кажется, как только вы выбираете ячейку и выбираете ее снова, она пытается загрузить CellEditingTemplate, который не указан в моем и вашем случае, и выдает исключение Visual / Visual3d.

Я исправил это, указав IsReadOnly = "True" на моем DataGridTemplateColumn . Я все равно не использую CellEditingTemplate, потому что я делаю массовые вставки с TextBoxes / DatePicker / Checkboxes и т. Д., Загруженными в шаблоны ячеек.

4 голосов
/ 17 декабря 2015

У меня была такая же проблема с сеткой данных с настраиваемым столбцом с гиперссылкой со встроенным прогоном, с привязкой, установленной в свойстве Текст прогона. Когда привязка прогона Text явно не была установлена ​​на BindingMode.OneWay , я получил эту ошибку. Установка его явно решила проблему. Обратите внимание, что я получил исключение при редактировании ЛЮБЫХ столбцов в сетке данных, а не только в этом.

0 голосов
/ 28 января 2016

Я получаю ту же ошибку при редактировании столбца в сетке данных. здесь столбец xaml:

 <DataGridTextColumn Header="Precio Unit." Binding="{Binding UnitPrice,StringFormat=0.00}" Width="Auto" MinWidth="115" />

Но ошибка произошла в другом столбце; здесь xaml:

                        <DataGridTemplateColumn Header="Descripción" MinWidth="600" Width="Auto" IsReadOnly="True" >
                            <DataGridTemplateColumn.CellTemplate >
                                <DataTemplate >
                                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                                        <TextBlock Text="{Binding FixedName, Converter={StaticResource toUpperConverter}}" Background="Transparent" 
                                                VerticalAlignment="Center" Margin="0"/>
                                        <TextBlock Margin="5,0,0,0" Foreground="#FFCB6A6A" FontWeight="Normal">
                                            <Run Text="( Stock "/>
                                            <Run Text="{Binding Stock}"/>
                                            <Run Text=" )"/>
                                        </TextBlock>
                                    </StackPanel>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

Ошибка исчезает с указанием явно:

<Run Text = "{Binding Stock, Mode = OneWay}" />
0 голосов
/ 15 сентября 2010

Я часто получаю эту ошибку в Blend, но не во время выполнения в DataGrid.

Я обнаружил, что либо компиляция приложения (в моем случае в VS) и разрешение Blend для перезагрузки DLL исправляют это. Кроме того, перестановка столбцов, кажется, запускает его для обновления. Хотя большая боль!

...