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

发布于 2024-09-14 19:33:59 字数 944 浏览 9 评论 0 原文

您好,

在 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,则双击可以工作,但随后我会看到一个禁用的列表视图,它看起来不正确,并且任何样式黑客都感觉像是丑陋的拼凑。

请注意,我尝试过单击编辑,但没有别耍花招。

任何帮助表示感谢,谢谢!

Greetings,

In an WPF DataGridTemplateColumn I have a CellTemplate using a ListView and a CellEditingTemplate using a 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>

The problem I am facing is how to force the column into edit mode on double click? This is the default behaviour for the other columns and I believe for the DataGrid in general. Pressing F2 starts edit mode, but double click using mouse does not.

If I set the ListView.IsEnabled to False then the double click works, but then I have a disabled list view which doesn't look right and any style hack feels like an ugly kludge.

Note that I have tried single click editing which didn't do the trick.

Any help appreciated, thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

末骤雨初歇 2024-09-21 19:33:59

当然,一旦我这么问,答案就会具体化:)如果我使用 单击编辑技巧并将其连接到列表视图双击它一切按预期工作:

<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();
    }
}

Of course as soon as I ask SO, the answer materializes :) If I use the FindVisualParent method from the single click editing trick and wire that up to the list view double click it all works as expected:

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

and in the code behind:

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();
    }
}
执手闯天涯 2024-09-21 19:33:59

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

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

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

我的博客

I had very similar problem with my DataGrid. Here is what caused the problem in my project: The ItemsSource in my DataGrid is assigned a custom list that implements IEnumerable.

I implemented this list so that it returns different object for different calls of the same index.. like if you call list[0] the first time it returns an object that holds the name "WPF" for example if you call it again list[0] it will return for you a completely new object that holds the value "WPF".

So if the collection (Limits) you are binding to, is a custom collection that you implemented IEnumerable and IList interfaces for it, then check your implementation. in my case, it was the index operator, IndexOf and Contains.

My Blog

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文