从@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 的代码帮助了我。