Перевести 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.