Перевести DataGrid в режим редактирования при использовании ListView for CellTemplate. - PullRequest
1 голос
/ 17 августа 2010

Greetings,

В WPF DataGridTemplateColumn у меня есть CellTemplate, использующий ListView, и CellEditingTemplate, использующий DataGrid.

<DataTemplate x:Key="LimitsTemplate">
    <ListView ItemsSource="{Binding Limits}" IsEnabled="False">
        <ListView.ItemTemplate>
            ...
        </ListView.ItemTemplate>
    </ListView>
 </DataTemplate>
 <DataTemplate x:Key="LimitsEditingTemplate">
      <toolkit:DataGrid ItemsSource="{Binding Limits}" ...>
            ...
      </toolkit:DataGrid>
 </DataTemplate>

Проблема, с которой я сталкиваюсь, состоит в том, как перевести столбец в режим редактирования при двойном щелчке?Это поведение по умолчанию для других столбцов, и я считаю, что для DataGrid в целом.Нажатие F2 запускает режим редактирования, но двойной щелчок мышью - нет.

Если я установил для ListView.IsEnabled значение False, тогда двойной щелчок сработает, но у меня будет отключенное представление списка, которое выглядит неправильно илюбой стиль хакера выглядит как уродливый клудж.

Обратите внимание, что я пробовал редактирование одним кликом , которое не помогло.

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Конечно, как только я спрашиваю SO, ответ материализуется :) Если я использую метод FindVisualParent из трюка редактирования одним щелчком и подключаю его к представлению списка, двойной щелчок мышью все работает как положено :

<DataTemplate x:Key="LimitsTemplate">
    <ListView ItemsSource="{Binding Limits}" PreviewMouseDoubleClick="limitsListView_PreviewMouseDoubleClick">
    ...

и в коде:

static T FindVisualParent<T>(UIElement element) where T : UIElement
{
    UIElement parent = element;
    while (parent != null)
    {
        T correctlyTyped = parent as T;
        if (correctlyTyped != null)
        {
            return correctlyTyped;
        }

        parent = System.Windows.Media.VisualTreeHelper.GetParent(parent) as UIElement;
    }
    return null;
}

void limitsListView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DataGrid dataGrid = FindVisualParent<DataGrid>(sender as UIElement);
    if (dataGrid != null)
    {
        dataGrid.BeginEdit();
    }
}
0 голосов
/ 01 октября 2011

У меня была очень похожая проблема с моей DataGrid.Вот что вызвало проблему в моем проекте: ItemsSource в моей DataGrid назначен пользовательский список, который реализует IEnumerable.

Я реализовал этот список так, чтобы он возвращал разные объекты для разных вызовов одного и того же индекса.если вы вызываете list [0] в первый раз, когда он возвращает объект с именем «WPF», например, если вы вызовете его снова list [0], он вернет вам совершенно новый объект, который содержит значение «WPF».

Итак, если коллекция (Limits), к которой вы привязываете, является пользовательской коллекцией, для которой вы реализовали интерфейсы IEnumerable и IList, то проверьте свою реализацию.в моем случае это был оператор индекса IndexOf и Contains.

Мой блог

...