如何在不使用SelectionChange事件的情况下从ListBox中选择项目

时间:2014-05-27 14:46:35

标签: c# silverlight listbox silverlight-5.0 selecteditem

我是Silverlight开发人员并使用C#编码从列表中选择一个项目并在附近的textBlock中显示所选项目。

我这样做的代码是:

ListBox lines = new ListBox(); 
TextBlock txtblkShowSelectedValue = new TextBlock();
ScrollViewer scrollViewer = new ScrollViewer();            
scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
lines.ItemsSource = param.Component.Attributes.Items;

Grid.SetColumn(lines, 1);
Grid.SetRow(lines, LoopCount);
childGrid.Children.Add(lines);
lines.SelectedIndex = 0;
lines.SelectedItem = param.Component.Attributes.Items;

问题是如何选择值以及如何在文本块“txtblkShowSelectedValue”中显示它?因为如果我使用selectionChange事件,我无法全局声明textblock和List变量因为当前条件

编辑:当前场景是:(行(列表)具有不同的功能,因此它不在List_SelectionChanged()函数的范围内)

 private static Grid GenerateList(Parameter param, int LoopCount, Grid g) 
   {
       Grid childGrid = new Grid();
       ColumnDefinition colDef1 = new ColumnDefinition();
       ColumnDefinition colDef2 = new ColumnDefinition();
       ColumnDefinition colDef3 = new ColumnDefinition();
       childGrid.ColumnDefinitions.Add(colDef1);
       childGrid.ColumnDefinitions.Add(colDef2);
       childGrid.ColumnDefinitions.Add(colDef3);

       TextBlock txtblk1ShowStatus = new TextBlock();
       TextBlock txtblkLabel = new TextBlock();

       ListBox lines = new ListBox();
       ScrollViewer scrollViewer = new ScrollViewer();
       scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
       lines.ItemsSource = param.Component.Attributes.Items;

       Grid.SetColumn(lines, 1);
       Grid.SetRow(lines, LoopCount);
       childGrid.Children.Add(lines);
       lines.SelectedIndex = 0;
       lines.SelectedItem = param.Component.Attributes.Items;
       lines.SelectionChanged += new SelectionChangedEventHandler(List_SelectionChanged);
       lines.SelectedIndex = lines.Items.Count - 1;

       g.Children.Add(childGrid);
       return (g);
   }
    static void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        MessageBox.Show("clist   _SelectionChanged1");
        TextBlock txtblk1ShowStatus = new TextBlock();
        txtblk1ShowStatus.Text = lines[(sender as ListBox).SelectedIndex];
    }

3 个答案:

答案 0 :(得分:1)

lines.SelectionChanged+=new System.EventHandler(this.UpdateTextBlock); // add selectionchanged even for your listbox;

private void UpdateTextBlock(object sender, SelectionChangedEventArgs e)
{
    txtblkShowSelectedValue.Text=this.lines[(sender as Listbox).SelectedIndex].ToString(); // just edit the content of your texblock
}

编辑:谢谢你,抱歉迟到了:-)

试试这个:

为函数添加参数,如下所示:

    lines.SelectionChanged += new SelectionChangedEventHandler(List_SelectionChanged)

更改此功能的参数并将文本块设置为:

static void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("clist   _SelectionChanged1");
    txtblkShowSelectedValue.Text=this.lines[(sender as Listbox).SelectedIndex].ToString()
}

答案 1 :(得分:1)

这可以简化,但应该作为解决问题的一种方法的快速肮脏的例子...

    void lb_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Grid g = null;
        ListBox lb = sender as ListBox;
        if (lb != null && lb.SelectedIndex >= 0)
        {

            // Find the top-level grid
            var parent = VisualTreeHelper.GetParent(lb);
            while (parent != null)
            {
                if (parent.GetType() == typeof(Grid))
                {
                    if ((parent as Grid).Name.Equals("LayoutRoot"))
                    {
                        g = (Grid)parent;
                        break;
                    }
                }
                parent = VisualTreeHelper.GetParent(parent);
            }
            // Found the LayoutRoot, find the textblock
            if (g != null)
            {
                for (int i = 0; i < g.Children.Count; i++)
                {
                    var child = VisualTreeHelper.GetChild(g, i);
                    if (child is TextBlock)
                    {
                        (child as TextBlock).Text = (string)lb.SelectedItem;
                        break;
                    }
                }
            }
        }
    }

你也可以命名你的文本块并搜索它(正如我为&#34; LayoutRoot&#34;所做的那样)。
显然,此代码假定textblock是顶级Grid的子代。实现递归搜索并不困难。

答案 2 :(得分:1)

Afteralli解决了这样的问题:

       lines.SelectionChanged += (o, e) =>
        {
            MessageBox.Show("clist   _SelectionChanged1");
            txtblk1ShowStatus.Text = lines.SelectedItem.ToString();
        };
        lines.SelectedIndex = lines.Items.Count - 1;

在我的函数GenerateList(..)