Проблема выбора TreeView в Silverlight 3 - PullRequest
2 голосов
/ 17 февраля 2010

У меня есть элемент управления TreeView из System.Windows.Controls на главной странице.

<controls:TreeView x:Name="Tree" 
  SelectedItemChanged="Tree_SelectedItemChanged" />

MainPage ctor выглядит так:

  public MainPage()
        {
            InitializeComponent();

            for (int i = 0; i < 10; ++i)
               Tree.Items.Add(new TreeViewItem() { Header = i.ToString() } );

            (Tree.Items[0] as TreeViewItem).IsSelected = true;
        }

Просто заполните TreeView и выберите первый элемент.

В Tree_SelectedItemChanged я хочу выполнить какое-то действие с элементом выделения, но Tree.SelectedItem имеет нулевое значение.

Я не понимаю, почему это происходит. TreeView в Wpf работает отлично.

У вас есть идеи по этому поводу?

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

Ммм ... Это странно!
Что вы можете сделать, чтобы обойти эту проблему, примерно так:

private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        object SelectedValue;
        if (Tree.SelectedValue == null)
        {
            foreach (object ti in Tree.Items)
            {
                if (((TreeViewItem)ti).IsSelected)
                {
                    SelectedValue = ti;
                    break;
                }
            }
        }
        else
        {
            SelectedValue = Tree.SelectedValue;
        }
    }

Или вместо Tree.SelectedValue == null вы также можете использовать bool, например. isFirstLoad или что-то в этом роде!
Вопрос Стэнжа это ...

0 голосов
/ 18 февраля 2010

Это действительно зависит от того, когда вы смотрите на триггер, который имеет место. Если вы посмотрите на курок в первый раз [т.е. если вы установите (Tree.Items[0] as TreeViewItem).IsSelected = true; и на этом этапе будете иметь точку останова, то вы выберете элемент как null. Причина в том, этот триггер происходит для установки первого выбранного элемента.

Просто ради интереса, я немного изменил твой код на это.

 for (int i = 0; i < 10; ++i)
            Tree.Items.Add(new TreeViewItem() { Header = i.ToString(), Name = i.ToString()});

        (Tree.Items[0] as TreeViewItem).IsSelected = true;

Я установил точку останова в событии Tree_SelectedItemChanged, и она срабатывает, как только вы установите (Tree.Items[0] as TreeViewItem).IsSelected = true;. До этого момента выбранный элемент будет нулевым.

Если у вас установлен Toolkit, вы также можете ссылаться на System.Windows.Controls.Toolkit . Затем вы получаете доступ к методу Tree.SelectItem(Tree.Items[0]). Он не фиксирует тот факт, что изначально он является нулевым, но также не вызывает срабатывание выбранного элемента.

Однако каждый раз, когда я менял выбор, выбранный пункт был правильным.

Надеюсь, это поможет.

...