2012-07-13 46 views
0

我有一個樹狀對象結構三個層次深,曾試圖代表在DataGrid中。嵌套WFC DataGrid中給出的NullReferenceException

我會展示XAML下方,但基本上是一個頂級的DataGrid,與包含一個切換按鈕一個DataGridTemplateColumn。如果單擊該按鈕,它將顯示第二個DataGrid,它具有相同的設置。這應該允許您單擊第二個網格中的ToggleButton並顯示第三個(也是最後一個)DataGrid。

這是預期的結果:

enter image description here

所以,你需要點擊「目的地......」,以示目標網格,然後單擊「表達式...」以顯示細節。

兩個按鈕都具有相同的代碼實現:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ToggleButton Content="Destinations..." ButtonBase.Click="ToggleButton_Click" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

如果兩個按鈕都分配其點擊處理程序(相同的處理,或不同),我得到一個NullReferenceException當我點擊「目的地......」(前目的地網格甚至顯示)。

但如果我拿出處理程序「表達式...」按鈕,一切都顯示只是花花公子,但當然不能展開內部網格。

的問題不在於我的對象,因爲如果我只是從所有三級離開網格的RowDetailsVisibilityMode =「可見」的數據網格中的反映。這個問題似乎與使用內部網格上的ButtonBase.Click事件隔離。

這裏的XAML:

<Window x:Class="SPConvert.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Stored Procedure Converter" Height="425" Width="705"> 
    <Grid> 
     <DataGrid Name="conversionsGrid" RowDetailsVisibilityMode="Collapsed" CanUserAddRows="False"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ToggleButton Content="Destinations..." ButtonBase.Click="ToggleButton_Click" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <StackPanel DockPanel.Dock="Left"> 
         <Label Content="Add destination paths" /> 
         <DataGrid ItemsSource="{Binding Destinations}" RowDetailsVisibilityMode="Visible"> 
          <DataGrid.Columns> 
           <DataGridTemplateColumn> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate> 
              <ToggleButton Content="Expressions..." ButtonBase.Click="ToggleButton_Click" /> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 
          </DataGrid.Columns> 
          <DataGrid.RowDetailsTemplate> 
           <DataTemplate> 
            <DataGrid ItemsSource="{Binding Expressions}" AutoGenerateColumns="True"> 
            </DataGrid> 
           </DataTemplate> 
          </DataGrid.RowDetailsTemplate> 
         </DataGrid> 
        </StackPanel> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </Grid> 
</Window> 

更新: 我起初不包括單擊處理程序的代碼,因爲異常不會發生在那裏。調試時,我可以看到(執行Destinations按鈕的)點擊,並返回一個有效的行(並確認它是正確的行)。只要未分配內部按鈕(表達式)的事件處理程序,該行就會擴展爲花花公子。當分配時,我得到錯誤。但請記住,表達式按鈕從不被點擊,我可以在調試器中確認該處理程序只執行一次。

這裏是點擊處理程序的代碼:

private DataGridRow FindClickedRow(DependencyObject dep) 
{ 
    // dep is the DependencyObject that was clicked. We can then iterate up the visual tree to find the clicked row. 
    while ((dep != null) && !(dep is DataGridRow)) 
     dep = VisualTreeHelper.GetParent(dep); 
    return dep as DataGridRow; 
} 

private void ToggleButton_Click(object sender, RoutedEventArgs e) 
{ 
    DataGridRow row = FindClickedRow(e.OriginalSource as DependencyObject); 
    row.DetailsVisibility = (row.DetailsVisibility == Visibility.Collapsed)?Visibility.Visible:Visibility.Collapsed; 
} 
+2

也許點擊處理程序的代碼會很有用? – Botz3000 2012-07-17 07:17:52

+0

嘗試包裝所有處理程序以嘗試捕獲並添加跟蹤/調試消息。 檢查所有屬性的getter和setter。 – gabba 2012-07-17 09:35:16

回答

3

link描述問題。

簡單地說,你可以不重視了在RowDetailsTemplate內聯事件的表單模板。

1解決方法:將您的模板來控制\窗口資源:

<Window.Resources> 
    <ResourceDictionary> 
     <DataTemplate x:Key="innertemplate"> 
      <ToggleButton Content="Expressions..." ButtonBase.Click="ToggleButton_Click" /> 
     </DataTemplate> 

     <DataTemplate x:Key="template"> 
      <StackPanel DockPanel.Dock="Left"> 
       <Label Content="Add destination paths" /> 
       <DataGrid ItemsSource="{Binding Destinations}" RowDetailsVisibilityMode="Visible"> 
        <DataGrid.Columns> 
         <DataGridTemplateColumn CellTemplate="{StaticResource innertemplate}"> 

         </DataGridTemplateColumn> 
        </DataGrid.Columns> 
        <DataGrid.RowDetailsTemplate> 
         <DataTemplate> 
          <DataGrid ItemsSource="{Binding Expressions}" AutoGenerateColumns="True"> 
          </DataGrid> 
         </DataTemplate> 
        </DataGrid.RowDetailsTemplate> 
       </DataGrid> 
      </StackPanel> 
     </DataTemplate> 
    </ResourceDictionary> 
</Window.Resources> 

,並在格引用它:

RowDetailsTemplate="{StaticResource template}" 

第二個解決方案:移動模板的內容,用戶控件,並添加模板:

<DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <local:YourControl /> 

其中local在我的項目中xmlns:local="clr-namespace:WpfApplication1"

+0

我用你的第一個解決方案去了,它完美的工作。謝謝!看起來像StackOverflow只會讓我明天獎勵賞金,所以我會做。 – 2012-07-17 10:59:29

相關問題