6

当我双击 - 或者当它已经聚焦时单击一次 - 在我的 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”条目下方单击的那个图像:( 来源:666kb.com替代文字

编辑:这个错误也已经通过工具提示在 XAML 中可见,只是还没有看到那个错误工具提示......

4

5 回答 5

9

这似乎确实是一个错误。我运行了您的重现项目并在引发异常时检查了调用堆栈。它在调用 VisualTreeHelper.IsAncestorOf 期间发生在 DataGridCell.RemoveBindingExpressions 中。后一种方法在传递一个不是 Visual 或 Visual3D 的对象时会引发异常。但是 DataGridCell 将任何元素作为绑定的目标传递给它。在您的情况下,这恰好是不是从 Visual 派生的 Run。

我在想您可以通过使用 IValueConverter 创建 FlowDocument 并绑定 RichTextBox.Document 来解决它,以便将绑定应用于 RichTextBox。但是由于 Document 不是依赖属性,所以它不能成为绑定的目标。

因此,您可能想要做的是创建一个承载 RichTextBox 控件的 UserControl:

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

然后在该用户控件中,您将负责构建 RichTextBox、文档、运行等。不幸的是,我认为这只是 DataGrid 控件中的一个限制(又名错误)。

于 2010-03-10T06:13:55.103 回答
6

有趣的是,这也发生在我身上。乔什的话让我思考。似乎一旦您选择了单元格并再次选择它,它就会尝试加载在我和您的情况下未指定的 CellEditingTemplate,它会引发 Visual/Visual3d 异常。

我通过在我的DataGridTemplateColumn上指定IsReadOnly ="True"来修复它。无论如何,我不使用 CellEditingTemplate,因为我正在使用单元格模板中加载的 TextBoxes/DatePicker/Checkboxes 等进行批量插入。

于 2012-10-19T13:48:53.230 回答
3

我对带有自定义列的 Datagrid 有同样的问题,该列带有嵌入运行的超链接,绑定设置在 Run 的 Text 属性上。当运行文本绑定未明确设置为BindingMode.OneWay 时,我收到此错误。明确设置它可以解决问题。请注意,在编辑数据网格中的任何列时,我遇到了异常,而不仅仅是这一列。

于 2015-12-17T01:33:57.830 回答
1

在数据网格中编辑列时出现同样的错误。这里 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}" />
于 2016-01-28T03:32:41.107 回答
0

我在 Blend 中经常收到此错误,但在运行时在 DataGrid 中没有。

我发现编译应用程序(在我的情况下是 VS)并允许 Blend 重新加载 DLL 可以修复它。此外,重新排列列似乎会触发它自行更新。虽然很痛!

于 2010-09-15T06:47:10.890 回答