使用ListView for CellTemplate时强制DataGrid进入编辑模式

时间:2010-08-17 07:38:42

标签: wpf datagrid celltemplate celleditingtemplate

问候,

在WPF DataGridTemplateColumn中,我有一个使用ListView的CellTemplate和一个使用DataGrid的CellEditingTemplate。

<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但没有做到这一点。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

当然,只要我问SO,答案就会实现:)如果我使用single click editing trick中的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();
    }
}

答案 1 :(得分:0)

我的DataGrid问题非常类似。以下是导致我的项目出现问题的原因:我的DataGrid中的ItemsSource被分配了一个实现IEnumerable的自定义列表。

我实现了这个列表,以便为同一索引的不同调用返回不同的对象。就像你第一次调用list [0]一样,如果你调用它就返回一个包含名称“WPF”的对象再次列出[0]它将为您返回一个包含值“WPF”的全新对象。

因此,如果您要绑定的集合(Limits)是您为其实现IEnumerable和IList接口的自定义集合,那么请检查您的实现。在我的例子中,它是索引运算符,IndexOf和Contains。

My Blog