Silverlight 3中的TreeView选择问题

时间:2010-02-17 15:45:50

标签: c# silverlight silverlight-3.0 treeview selection

我在MainPage上有System.Windows.Controls的TreeView控件。

<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的值为空。

我不明白为什么会这样。 Wpf中的TreeView工作正常。

你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

嗯......那是stange!
你可以做些什么来绕过这个问题是这样的:

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代替boolisFirstLoad或类似的东西!
Stange问​​题是......

答案 1 :(得分:0)

这实际上取决于你何时查看发生的触发器。如果你第一次看到触发器[即当您设置(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])。它并没有解决这个事实,即最初它是null,但它也不会触发选定的项目触发器。

但是,每次我从那里开始更改选择时,所选项目都是正确的。

希望这有帮助。