2014-10-09 25 views
0

我有一個的ListView查看是間列拖着GridView控件即:WPF GridViewColumnHeader禁用不可移動列

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

有了這個例子:

Before dragging

紅色文字兩列有風格適用於IsHitTestVisible屬性設置爲false - 這會阻止用戶移動這兩列。

然而,用戶可以將其他三列相互間拖拽

不幸的是,這種情況下,用戶可以移動這三個可移動的列之一之前第一或第二不可移動的列,從而移動這不應該是可移動的,像這裏柱:

After dragging

我的目標是讓不動的柱子保持在原位,同時允許可移動的柱子在它們之間移動。

不可移動列的數量是可變的,但有可能沒有固定的列,但也可能有兩個 - 如此處所示 - 或者甚至更多(對於較大的表格) 。

因此,問題是,如何阻止用戶在列本身無法移動之前移動列?

謝謝你的時間!

回答

0

從@Rida發現這個帖子後:

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

我決定來解決我的問題與的DependencyProperty稱爲FixedColumns和這是一個整數。

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事件處理程序和代碼基本上是什麼@Rida提出,但不是檢查,我檢查,看看是否NewStartingIndex比numbe小固定列的r。

如果是這種情況,那麼我只需取消此舉。

的結果是,我現在能有這樣的星座有兩個固定欄目:

Original state

如果有可能我拖到最後三列彼此之間,而不是固定的列前。

After dragging

請注意,當試圖固定的列前拖動列,但下降只是失敗這是我最主要的事情拖裝飾器仍然可見。 隨着時間的推移,我可以嘗試改變這種情況下的裝飾裝飾。

我希望這可以幫助某個人,因爲來自@RIDA的代碼幫助了我。