0

我有一个ListView,它的ViewGridView的,即:

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

用这个例子:

拖动前

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

然而,用户可以并且应该在它们之间拖动其他三列。

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

拖动后

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

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

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

感谢您的时间!

4

1 回答 1

0

从@Rida 找到这篇文章后:

如何在 WPF 中禁用 ListView 标头的移动/重新排序?

我决定用一个名为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是否小于固定列的数量。

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

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

原始状态

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

拖动后

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

我希望这有助于一路走来,因为@Rida 的代码帮助了我。

于 2014-10-14T11:54:08.843 回答