2010-08-17 4 views
1

Привет,Force 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, то работает двойной щелчок, но тогда у меня есть список заблокированных списков, который выглядит неправильно, и любой стиль взлома выглядит как уродливый kludge.

Обратите внимание, что я пробовал single click editing, который не сделал этого трюка.

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

ответ

1

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

<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

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

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

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

My Blog