我有一個樹狀對象結構三個層次深,曾試圖代表在DataGrid中。嵌套WFC DataGrid中給出的NullReferenceException
我會展示XAML下方,但基本上是一個頂級的DataGrid,與包含一個切換按鈕一個DataGridTemplateColumn。如果單擊該按鈕,它將顯示第二個DataGrid,它具有相同的設置。這應該允許您單擊第二個網格中的ToggleButton並顯示第三個(也是最後一個)DataGrid。
這是預期的結果:
所以,你需要點擊「目的地......」,以示目標網格,然後單擊「表達式...」以顯示細節。
兩個按鈕都具有相同的代碼實現:
<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;
}
也許點擊處理程序的代碼會很有用? – Botz3000 2012-07-17 07:17:52
嘗試包裝所有處理程序以嘗試捕獲並添加跟蹤/調試消息。 檢查所有屬性的getter和setter。 – gabba 2012-07-17 09:35:16