Перевести DataGrid в режим редактирования при использовании ListView для CellTemplate.

Привет,

В 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 ответа

Решение

Конечно, как только я спрашиваю 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();
    }
}

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

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

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

Мой блог

Другие вопросы по тегам