0

在我的程序中,我有一个TreeView通过 ViewModel 使用ObservableCollection. 每个集合都有一个名为 的属性Rank。这应该用作集合项的索引。

这个问题中,我能够让我的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正值?

编辑

如上所述,我RankTreeView. @Noctis 的回答建议在值更改TreeView后使用该属性对我进行排序。Rank我最喜欢的关于这个主题的问题证明了这一点,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(...);
     }
}
4

1 回答 1

1

您可以更改对象等级的实际值(假设它们是公共属性),而不是实际移动您的项目,并通过绑定为您自动完成排序......

编辑: 这很尴尬,正如你的评论所说,我的链接是 winforms。

话虽如此,请看一下rachelwpf-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 个项目的排名,并根据排名对树进行排序。

在您的应用程序中,只需弄清楚您正在交换哪个,然后您就可以设置...

于 2013-10-22T06:37:50.737 回答