2014-09-12 84 views
0

我正在使用觀察集合來存儲我綁定到WPF列表視圖的列表,我的問題是我試圖讓前端順序工作。在分鐘如果我點擊我的向上移動按鈕它的項目移動好,但它不改變列表中已經填充的項目。這應該很容易,但我很難找到它。列表移動向上和向下移動

我的問題是我如何正確地更改訂單號的位置,以反映用戶點擊鼠標後按鈕基於下面的序列和更新列表中的其他項目以反映新的位置,因爲目前不改變現有元素或新增元素的數量關係。

Order  Display Name  Width 
    1   Title   50 
    2   Description  150 

我使用添加按鈕

Order  Display Name  Width 
    1   Title   50 
    2   Description  150 
    3   Newitem   50 

添加項目到列表我點擊上移按鈕,一旦新的列表順序使用如下所示變成

Order  Display Name  Width 
    1   Title   50 
    2   Newitem   50 
    3   Description  150 

代碼IM

ObservableCollection<CustomColumnsModel> columnsList = this.WizardData.ConcreteCustomColumnsProxy; 
    Extensions.MoveItemUp(columnsList, this.listView1.SelectedIndex); 

    int offset = 0; 
    var selectedColumnItem = listView1.SelectedItem as CustomColumnsModel; 

    foreach (CustomColumnsModel item in columnsList) 
    { 

     foreach (CustomColumnsModel item in this.listView1.SelectedItems) 
     { 
      item.CustomColumnsOrder -= 1; 
     }else if (listView1.SelectedItem > item) 
     { 
       item.CustomColumnsOrder +1; 
     } 



    } 

以下g是我的擴展方法

public static void MoveItemUp<T>(this ObservableCollection<T> baseCollection, int selectedIndex) 
    { 
     //# Check if move is possible 
     if (selectedIndex <= 0) 
      return; 

     //# Move-Item 
     baseCollection.Move(selectedIndex - 1, selectedIndex); 
    } 

這是我的POCO類

public class CustomColumnsModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public const string IdPropertyName = "CustomColumnsID"; 
    private Guid _Id = Guid.Empty; 
    public Guid CustomColumnsID 
    { 
     get { return _Id; } 
     set 
     { 
      if (_Id == value) 
       return; 
      _Id = value; 
      NotifyPropertyChanged(IdPropertyName); 
     } 
    } 


    public string CustomColumnsDisplayName { get; set; } 
    public int CustomColumnsWidth { get; set; } 
    public int CustomColumnsOrder { get; set; } 


    protected void NotifyPropertyChanged(string key) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(key)); 
     } 
    } 

    public EnterpriseManagementObject ActualData { get; private set; } 

編輯,顯示代碼,嘗試了建議

foreach (CustomColumnsModel item in columnsList) 
    { 

     if (item.CustomColumnsOrder < item.ColumnIndex) 
     item.CustomColumnsOrder -= 1; 
     else if (item.CustomColumnsOrder > item.ColumnIndex) 
     item.CustomColumnsOrder -= 1; 
    } 
+4

那麼,你的問題是什麼? – Noctis 2014-09-12 10:55:03

+0

@Noctis在上面添加問題編輯他們的對不起 – rogue39nin 2014-09-12 11:00:21

回答

0

好像你需要有一個您的對象上的索引屬性,以及每當有人命中up時,如果它不是頂級的,則必須將索引號與其上面的索引號交換。

如果有人點擊down如果它不是最低的,則再次交換項目。

order id val
1。 。 。 1。一個
2。 。 。 2。兩個
3。 。 。 3。 3

將成爲(假設你撞了上去3):

訂單ID VAL
1。 。 。 1。一個
3。 。 。 2。 2
2。 。 。 3。三個

然後只需按順序對它們進行排序。


編輯

// The following will never be smaller than 0 
    if (selectedIndex <= 0) 
     return; 

    // This is not really doing what you want. 
    baseCollection.Move(selectedIndex - 1, selectedIndex); 

你想有一個變種item_to_move_up這是你的選擇指數等於項目,一個item_to_move_down這是一個它上面(假設你檢查了它不是第一個邏輯)。
接下來,交換它們的訂單值。例如:

var temp_val = item_to_move_up.order; 
item_to_move_up = item_to_move_down.order; 
item_to_move_down = temp_val; 
+0

你能否提供任何機會的代碼示例謝謝然後可以標記你的答案是正確的 – rogue39nin 2014-09-12 11:10:20

+0

答案是正確的任何一種方式。這個網站是爲了幫助你,而不是爲你寫你的代碼... – Noctis 2014-09-12 11:12:47

+0

沒有,但大多數人會提供一個簡短的例子,他們的幫助,以幫助這一切我知道 – rogue39nin 2014-09-12 11:26:31