2013-10-21 79 views
0

在我的程序中,我有一個TreeView,它是通過使用ObservableCollection通過ViewModel實現的。每個集合都有一個名爲Rank的屬性。這應該作爲收集物品的索引。更改ViewModel中ObservableCollection的屬性而不選擇它

this question,我能得到我的TreeView節點使用ObservableCollection.Move();

然而,爲了交換位置,交換節點的地方後,我需要糾正/更改節點的秩的價值,從而使我可以繼續操縱它們。

這應該有助於解釋我在做什麼:

視圖 - 代碼隱藏:

//Button Click Event -- This makes the Selected Node switch places with the node above it 
private void shiftUp_Click(object sender, RoutedEventArgs e) 
{ 
    //if a node is selected 
    if (UCViewModel.TreeViewViewModel.SelectedItem != null) 
    { 
     //If the selected Node is not in the 0 position (can not move up anymore) 
     if (UCViewModel.TreeViewViewModel.Collection<TreeViewModel>.IndexOf(UCViewModel.TreeViewViewModel.SelectedItem) != 0) 
     { 
      int oldIndex = UCViewModel.TreeViewViewModel.SelectedItem.Rank; 
      int newIndex = oldIndex--; 

      UCViewModel.TreeViewViewModel.Collection<TreeViewModel>.Move(oldIndex, newIndex); 

      //**Pseudo code trying to explain what I want to do 
      //**get item at specific index and change the Rank value 
      //Collection item at index (newIndex).Rank -= 1; 
      //Collection item at index (oldIndex).Rank += 1; 
     } 
    } 
} 

用戶控件 - XAML:

<TreeView ItemsSource="{Binding TreeViewViewModel.Collection<TreeModel>}" ... />

我怎樣才能糾正移動後的值爲Rank

編輯

如上所述,我在我的TreeView的數據模型Rank屬性。 @Noctis的答案建議在Rank值更改後使用該屬性對TreeView進行排序。我在這個主題上最喜歡的問題是here

我已將SortObservableCollection類添加到我的程序中,所以現在剩下的就是操縱排名值並進行排序。正確的位置是否來自代碼隱藏?基本上上述^部分來自哪裏?如果是這樣的話,我會有點困惑的確切電話...

代碼隱藏:

private void shiftUp_Click(object sender, RoutedEventArgs e) 
{ 
    //if a node is selected 
    if (UCViewModel.TreeViewViewModel.SelectedItem != null) 
    { 
     //Moves the selectedNode down one (Up visually, hence shiftUp) 
     UCViewModel.TreeViewViewModel.SelectedItem.Rank--; 

     //How would I get the node below the selected one and change the Rank? 

     //This would be the call to sort. Which needs to be called for the collection 
     //For some reason, sort does not come up for the collection... 
     //UCViewModel.TreeViewViewModel.Collection.**Sort(...); 
    } 
} 

回答

1

,而不是實際四處移動你的項目,你可以在你的對象改變實際值居(假設他們是公共屬性),並讓排序可以通過綁定...

編輯爲您自動完成: 這是令人尷尬的,和您的評論說,我的鏈接是的WinForms。

話雖如此,看看這個美好的回答,rachel,wpf-it,自己回答jeremy

他們實現了一個比較器(我想用msdn鏈接指示的方向),還是使用了默認標題。

這應該給你一個很好的開始和例子,說明如何用你的等級來做到這一點。

編輯

在XAML中:

<StackPanel x:Name="LayoutRoot"> 
<TreeView Name="TestTreeView" ItemsSource="{Binding MyTree}"> 
    <TreeView.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="Black" BorderThickness="1" Margin="2" Padding="2"> 
      <TextBlock Text="{Binding Path=Name}"/> 
      </Border> 
     </DataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 
<Button Command="{Binding SortMe_Command}">Sort</Button> 

在我有一個簡單的類這樣的視圖模型(與排名,爲你):

public class MyTreeClass 
{ 

    public string Name { get; set; } 
    public int Rank { get; set; } 
} 

我已添加rachel的課程:

public class SortableObservableCollection<T> : ObservableCollection<T> { ...} 

屬性的綁定:

public SortableObservableCollection<MyTreeClass> MyTree 
    { 
     get { return _myTree; } 
     set { _myTree = value; } 
    } 
private SortableObservableCollection<MyTreeClass> _myTree; 

命令的操作:

公衆的ICommand SortMe_Command {獲得;組; }

在構造函數中:

MyTree = new SortableObservableCollection<MyTreeClass>() {new MyTreeClass(){Name = "One",Rank = 1}, 
     new MyTreeClass(){Name = "Two",Rank = 2}, 
     new MyTreeClass(){Name = "Three",Rank = 3}}; 
     SortMe_Command = new RelayCommand<object>(Execute_SortMe); 
SortMe_Command = new RelayCommand<object>(Execute_SortMe); 

最後但並非最不重要的,execute方法:

private void Execute_SortMe(object obj) 
    { 
     MyTree[0].Rank = 5; 
     MyTree[1].Rank = 4; 

     MyTree.Sort(node => node.Rank); 
    } 

現在,當我按一下按鈕,它會改變2項的排名,和根據等級對樹進行度假。

在你的應用程序,只需找出你換哪一個的,和你設置...

+0

他們是'TreeView'的模型內聲明的公共屬性,但如何將改變' Rank'讓他們自動重新排序?我問這是因爲我創建了「Rank」。它不會自動轉換爲收集索引。 –

+0

那麼,看看[MSDN]中的這篇文章(http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.sort.aspx)。如果您提供自己的TreeViewNodeSorter,則可以按照您想要的方式對樹進行排序。 – Noctis

+0

該文章適用於Windows窗體 –

相關問題