2010-03-03 9 views
6

Wenn ich doppelklicke - oder klicken Sie einmal, wenn es bereits konzentriert - unter den Elementen in einem leeren Bereich der Listbox, die innerhalb meiner DataGridTemplateColumn ist, dann bekomme ich die obige Fehlermeldung.WPF: System.ArgumentException => {"'{0}' ist kein Visual oder Visual3D."}

Was mache ich falsch?

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

Regard, dass Bild, wo ich unter dem "myPhotos.png" item Eintrag klicken Sie auf:

Dies ist mein Code alt text http://666kb.com/i/bh6lbd47okwancfel.png

EDIT: Dieser Fehler ist auch bereits sichtbar in XAML via tooltip habe gerade diesen Fehler Tooltip nicht gesehen ...

+0

können Sie den Code hinter auf dieses Thema? –

+0

gibt es keinen Code hinter :) – msfanboy

+2

entsprechend = = http://social.msdn.microsoft.com/forums/en-US/wpf/thread/5982cafe-f75b-42b4-99dc-50d3a81b30b0/ ich wette Ich habe einen Fehler gefunden !!! – msfanboy

Antwort

8

Das scheint tatsächlich ein Fehler zu sein. Ich habe Ihr Repro-Projekt ausgeführt und den Aufruf-Stack ausgecheckt, als die Ausnahme ausgelöst wurde. Es geschieht in DataGridCell.RemoveBindingExpressions während eines Aufrufs von VisualTreeHelper.IsAncestorOf. Die letztere Methode löst eine Ausnahme aus, wenn ein Objekt übergeben wird, das nicht Visual oder Visual3D ist. Aber DataGridCell übergibt es, welches Element das Ziel der Bindung ist. In Ihrem Fall ist das ein Run, der nicht von Visual stammt.

Ich dachte, Sie könnten es umgehen, indem Sie einen IValueConverter verwenden, um das FlowDocument zu erstellen und RichTextBox.Document zu binden, sodass die Bindung auf RichTextBox angewendet wird. Da Document jedoch keine Abhängigkeitseigenschaft ist, kann es kein Bindungsziel sein.

Also statt, was Sie tun möchten ist ein Usercontrol erstellen, die die RichTextBox Steuerelement hostet:

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

Dann in diesem Benutzerkontrolle Sie kümmern sich um den Aufbau der RichTextBox, Dokument nehmen würde, laufen, leider usw. Ich denke, das ist nur eine Einschränkung (alias Bug) im DataGrid-Steuerelement.

+0

@Josh Sie scheinen richtig, ich versuchte Teleriks RadGridView und ersetzt das DataGrid von M $. Alles funktioniert gut, keine Ausnahme. Wenn du meinen anderen Thread auch mit dem RadGridView überprüfst, ist die RichTextbox nun nachlaufig und ich kann nicht sehr schnell tippen => http://stackoverflow.com/questions/2404736/wpf-richttextbox-typing-twice-slower-than-in-a- -vb-5-0-richtextbox – msfanboy

0

Ich bekomme diesen Fehler häufig in Blend, aber nicht zur Laufzeit in einem DataGrid.

Ich habe festgestellt, dass entweder das Kompilieren der Anwendung (in meinem Fall in VS) und das Zulassen, dass Blend die DLLs neu lädt, es behebt. Wenn Sie die Spalten neu anordnen, scheint dies zu bewirken, dass sie sich selbst aktualisiert. Großer Schmerz aber!

5

Interessanterweise ist mir das auch passiert. Was Josh gesagt hat, brachte mich zum Nachdenken. Es sieht so aus, als wenn Sie die Zelle einmal auswählen und erneut auswählen, versucht sie, die CellEditingTemplate zu laden, die in meinem Fall und in Ihrem nicht angegeben ist und die Visual/Visual3d-Ausnahme auslöst.

Ich habe es IsReadOnly = "True" auf meinem Datagridtemplatecolumn durch Angabe fixiert. Ich benutze das CellEditingTemplate sowieso nicht, weil ich Masseneinfügungen mit TextBoxen/DatePicker/Checkboxes usw. mache, die in die Zellenvorlagen geladen werden.

4

Ich hatte das gleiche Problem mit einem Datagrid mit einer benutzerdefinierten Spalte mit einem Hyperlink mit eingebettetem Lauf, mit der Bindung für die Text Eigenschaft Run festgelegt. Wenn der Lauf Text Bindung wurde nicht explizit auf BindingMode.OneWay Ich habe diesen Fehler. Durch die explizite Einstellung wurde das Problem gelöst. Hinweis Ich habe die Ausnahme beim Bearbeiten ANY Spalten im Datagrid nicht nur diese.

0

Ich bekomme den gleichen Fehler beim Bearbeiten einer Spalte in einem Datengrid. Hier XAML-Spalte:

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

Aber der Fehler trat in einer anderen Spalte auf; hier die 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> 

Der Fehler Angabe ausdrücklich verschwindet:

<Run Text = "{Binding Stock, Mode = OneWay}" /> 
Verwandte Themen