WPF GridViewColumnHeader禁用在不可移动列之间拖动列

时间:2014-10-09 08:40:57

标签: wpf gridviewcolumn

我有一个 ListView ,其 View GridView 的那个:

<ListView>
    <ListView.View>
        <GridView />
    </ListView.View>
</ListView>

通过这个例子:

Before dragging

带有红色文本的两列应用样式,其中 IsHitTestVisible 属性设置为false - 这会阻止用户移动这两列。

然而,用户可以将其他三列拖到其中

不幸的是,在这种情况下,用户可以移动之前的三个可移动列中的一个第一个或第二个不可移动的列,从而移动一个不应该移动的列,如下所示:

After dragging

我的目标是将不可移动的柱子保持在原位,同时允许可移动的柱子在它们之间移动。

不可移动列的数量是可变的, GridView 可能没有任何固定列,但也可能有两个 - 如此处所示 - 甚至更多(对于较大的表格。)

因此,问题是,如何阻止用户在无法移动的列之前移动列?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

从@Rida找到这篇文章后:

How to disable Moving/ReOrdering of ListView Header in WPF?

我决定使用名为 FixedColumns DependencyProperty 解决我的问题,这是一个整数。

public class ColumnsExtension : DependencyObject
{
    public static readonly DependencyProperty FixedColumnsProperty =
        DependencyProperty.RegisterAttached("FixedColumns", typeof(int),
        typeof(ColumnsExtension), new PropertyMetadata(0));

    public static int GetFixedColumns(DependencyObject obj)
    {
        return (int)obj.GetValue(FixedColumnsProperty);
    }

    public static void SetFixedColumns(DependencyObject obj, int value)
    {
        obj.SetValue(FixedColumnsProperty, value);
    }
}

我解析包含描述列的数据的文本文件,如果我遇到一个要修复其位置的列,那么我会增加固定列的数量:

foreach (var parsedColumn in parsedColumns)
{
    var fCols = this.TestLV.GetValue(ColumnsExtension.FixedColumnsProperty);

    // increase the number of fixed columns
    if (parsedColumn.ColumnResize == ColumnResize.IsFixed)
        this.TestLV.SetValue(ColumnsExtension.FixedColumnsProperty, (int)fCols + 1);

    // ...
}

解析完成后,我订阅 CollectionChanged EventHandler,代码基本上与@Rida建议的一样,但不是检查 0 ,我查看看看如果 NewStartingIndex 小于固定列数。

如果是这种情况,那么我只是取消移动。

结果是我现在可以拥有两个固定列的星座:

Original state

我可以在它们之间拖动最后三列,但不能在固定列之前拖动。

After dragging

请注意,在尝试在固定列之前拖动列时,拖动装饰器仍然可见但是拖放只是失败,这对我来说是主要的。 随着时间的推移,我可能会尝试为这种情况更改掉落装饰。

我希望这可以帮助一路上的人,因为@Rida的代码帮助了我。