WPF:System.ArgumentException => {“'{0}'不是Visual或Visual3D。”}

时间:2010-03-03 21:46:53

标签: wpf exception listbox datagridtemplatecolumn

当我双击时 - 或者当它已经聚焦时单击一次 - 在我的DataGridTemplateColumn中的Listbox的空白区域中的项目下面,然后我收到上面的错误消息。

我错了什么?

这是我的代码:

<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 http://666kb.com/i/bh6lbd47okwancfel.png

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

5 个答案:

答案 0 :(得分:8)

这确实是一个错误。我运行你的repro项目并在抛出异常时检出调用堆栈。它在调用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控件中的一个限制(也就是bug)。

答案 1 :(得分:6)

有趣的是,这也发生在我身上。乔什说的话让我思考。看起来,一旦你选择了单元格并再次选择它,它会尝试加载未在我的情况下指定的CellEditingTemplate,并且它会抛出Visual / Visual3d异常。

我通过在 DataGridTemplateColumn 上指定 IsReadOnly =“True”来解决此问题。我还是不使用CellEditingTemplate,因为我在单元格模板中加载了TextBoxes / DatePicker / Checkbox等等的批量插入。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

编辑数据网格中的列时出现同样的错误。这里是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}" />