2013-10-21 38 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窗体 –

相关问题