ListCollectionView не отслеживает текущий выбранный элемент в TreeView в WPF - PullRequest
1 голос
/ 25 августа 2011

Я сделал этот действительно простой пример, это окно с TreeView и кнопкой.Когда вы нажимаете кнопку, вы видите выбранный элемент, но он не работает, свойство CurrentItem не обновляется при изменении выбора:

C #:

using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Data;

namespace TreeViewSort
{
public partial class Window1
{
    private ObservableCollection<string> _items;
    public ListCollectionView SortedItems { get; private set; }

    public Window1()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _items =new ObservableCollection<string>();
        _items.Add("ZZ");
        _items.Add("AA");
        _items.Add("CA");
        _items.Add("DA");
        _items.Add("EA");

        this.SortedItems = new ListCollectionView(_items);
        this.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(this.SortedItems.CurrentItem.ToString());
    }
}
}

XAML:

<Window x:Class="TreeViewSort.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <DockPanel>
        <TreeView DockPanel.Dock="Top" Name="treeView1" ItemsSource="{Binding SortedItems, Mode=TwoWay}" MinHeight="200" />
        <Button DockPanel.Dock="Bottom" Click="Button_Click">
            Test
        </Button>
    </DockPanel>
</Window>

Документация MSDN гласит:

Если целью является ItemsControl, текущий элемент синхронизируется с выбранным элементом

Любое представление о том, почемуэто не работает?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Даже когда в документации сказано, что это будет работать с любым ItemControl, я прочитал (и увидел), что он работает только с селекторами ...

0 голосов
/ 25 августа 2011

Я должен был сделать это, и это было не красиво.У меня есть гибридное дерево / сетка данных.Чтобы иметь возможность перейти к следующему / предыдущему элементу или перемещать элементы вверх и вниз, мне нужно было сделать следующее.

  1. Добавить свойство IsSelected в мою модель (хак, я знаю)
  2. Каждая модель имела свойство порядка сортировки
  3. Когда элемент был выбран в дереве - используйте запросы linq, чтобы найти любые другие выбранные элементы и пометить как невыбранные
  4. Отметить элемент, которыйбыл просто выбран как IsSelected
  5. Затем используйте пользовательскую логику (под пользовательским я имею в виду 150 плюс строки кода), чтобы определить, где должен быть следующий элемент.Эта логика, однако, учитывала элементы, которые были свернуты в дереве и на двух уровнях (родитель / потомок).

IIRC, поэтому мне пришлось сделать это, чтобы значения, которые мне были нужны, были в визуальном дереве, но я работал с логическим деревом.

0 голосов
/ 25 августа 2011

Я не уверен насчет CurrentItem в ListCollectionView, попробуйте сделать это ниже: Создайте свойство в своем классе Window1 -> публичная строка SelectedItem {get; задавать; } В XAML свяжите свойство SelectedItem элемента управления представления дерева со своим свойством SelectedItem.

Должно работать.

О SelectedItem -> http://msdn.microsoft.com/en-us/library/system.windows.controls.treeview.selecteditem.aspx

С уважением Павел Янковский

...