FindParent <T>имеет значение null при использовании WPFToolkit: Datagrid - PullRequest
1 голос
/ 04 февраля 2012

Когда я использую код xaml.

<DataGrid Name="DataGrid1" 
          ItemsSource="{Binding Path=MainSearchBinding}"  
          HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
          CanUserAddRows="False" CanUserDeleteRows="False"
          CanUserResizeRows="False" CanUserSortColumns="True"
          AutoGenerateColumns="False" IsTextSearchEnabled="True" IsReadOnly="True" 
          RowHeaderWidth="17" SelectionChanged="DataGrid1_SelectionChanged"
          MouseDoubleClick="OnDoubleClick" MouseLeftButtonUp="OnMouseClick">

Работает нормально.
При переключении на <WpfToolkit:Datagrid></WpfToolkit:Datagrid>:

<WpfToolkit:DataGrid Name="DataGrid1" 
                     ItemsSource="{Binding Path=MainSearchBinding}"  
                     HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
                     CanUserAddRows="False" CanUserDeleteRows="False"
                     CanUserResizeRows="False" CanUserSortColumns="True"
                     AutoGenerateColumns="False" IsTextSearchEnabled="True" IsReadOnly="True" 
                     RowHeaderWidth="17" SelectionChanged="DataGrid1_SelectionChanged"
                     MouseDoubleClick="OnDoubleClick" MouseLeftButtonUp="OnMouseClick">

У меня ошибка:

"Значение не может быть нулевым. Имя параметра: элемент"

с FindParent<T>(...) в этой строке:

DependencyObject parentObject = VisualTreeHelper.GetParent(child);

public static T FindParent<T>(this DependencyObject child)
        where T : DependencyObject
{
    //get parent item
    DependencyObject parentObject = VisualTreeHelper.GetParent(child);

    //we've reached the end of the tree
    if (parentObject == null) return null;

    //check if the parent matches the type we're looking for
    var parent = parentObject as T;
    if (parent != null)
    {
        return parent;
    }
    else
    {
        return FindParent<T>(parentObject);
    }
}

Мой код здесь.Открывается новая вкладка, если вы нажимаете на ячейки таблицы данных.

var tabControl = (sender as DataGrid).FindParent<TabControl>();
tabControl.Items.Add(new TabItem() { Header = "Документ", Content = docview, IsSelected = true });

Я знаю, что что-то упустил, пожалуйста, покажите мне, куда двигаться?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Проблема в этой строке здесь:

var tabControl = (sender as DataGrid).FindParent<TabControl>();

В DataFrid WPF Toolkit есть класс Microsoft.Windows.Controls.DataGrid, тогда как во встроенной WPG DataGrid есть класс System.Windows.Controls.DataGrid.Если ваш sender объект представляет собой DataGrid WPF Toolkit, а DataGrid в строке кода выше представляет собой встроенную WPF DataGrid, тогда sender as DataGrid будет нулевым.WPF Toolkit DataGrid полностью отделен от встроенного DataGrid и, в частности, не наследует его.

К счастью, эту проблему легко исправить.Вам не нужно приводить sender в класс DataGrid.Ваш метод расширения FindParent<T> работает на DependencyObject s, и оба класса DataGrid наследуются от DependencyObject, поэтому вы можете написать

var tabControl = (sender as DependencyObject).FindParent<TabControl>();

вместо.

1 голос
/ 04 февраля 2012

Судя по всему, ваша ошибка будет исходить из строки:

DependencyObject parentObject = VisualTreeHelper.GetParent(child);

потому что child будет null. Вы пытаетесь привести sender к DataGrid, поэтому он работает в первый раз, так как вы используете DataGrid. Но во второй раз я предполагаю, что вы используете другой DataGrid (возможно, пользовательский); поэтому приведение вернет null. Поэтому при звонке FindParent(...), child будет null.

При получении ошибки посмотрите на трассировку стека и посмотрите, откуда возникла ошибка. Он должен показывать вам точную строку, и, просматривая отладчик, вы сможете увидеть, какое значение равно null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...