从Window中获取用户控件中的选定列表框项

时间:2012-12-19 09:29:45

标签: c# wpf user-controls selectionchanged

我有User control list box

User control位于我的窗口。 如何从用户控件中的列表框中检测并获取所选项目?

我以前试过这个但是当我从列表框e.OriginalSource中选择一个项目时返回TextBlock类型。

  private void searchdialog_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            //This return TextBlock type
            var conrol= e.OriginalSource;
            //I Want something like this
            if (e.OriginalSource is ListBoxItem)
            {
                ListBoxItem Selected = e.OriginalSource as ListBoxItem;
                //Do somting
            }
        }

或者有更好的方法可以检测来自我的表单中的列表框SelectionChanged吗?

2 个答案:

答案 0 :(得分:3)

我认为最好的方法是在用户控件上声明一个事件,只要在列表框上触发SelectedValueChanged事件就会触发该事件。

public class MyUserControl : UserControl
{
  public event EventHandler MyListBoxSelectedValueChanged;

  public object MyListBoxSelectedValue
  {
    get { return MyListBox.SelectedValue; }
  }

  public MyUserControl()
  {
    MyListBox.SelectedValueChanged += MyListBox_SelectedValueChanged;
  }

  private void MyListBox_SelectedValueChanged(object sender, EventArgs eventArgs)
  {
    EventHandler handler = MyListBoxSelectedValueChanged;
    if(handler != null)
      handler(sender, eventArgs);
  }
}

在窗口中,您可以监听事件并使用用户控件中的公开属性。

public class MyForm : Form
{
  public MyForm()
  {
    MyUserControl.MyListBoxSelectedValueChanged += MyUserControl_MyListBoxSelectedValueChanged;
  }

  private void MyUserControl_MyListBoxSelectedValueChanged(object sender, EventArgs eventArgs)
  {
    object selected = MyUserControl.MyListBoxSelectedValue;
  }
}

答案 1 :(得分:1)

有几种方法可以解决这个问题:

  1. 在您的usercontrol中实现SelectionChanged事件,并引发您在窗口中处理的自定义事件:

    //在你的usercontrol中

    private void OnListBoxSelectionChanged(object s, EventArgs e){
        if (e.AddedItems != null && e.AddedItems.Any() && NewItemSelectedEvent != null){   
            NewItemsSelectedEvent(this, new CustomEventArgs(e.AddedItems[0]))
        }
    }
    

    //在你的窗口中

    myUserControl.NewItemsSelected += (s,e) => HandleOnNewItemSelected();
    
  2. 如果您使用绑定或任何形式的MVVM,您可以使用DependencyProperty将所选项目绑定到viewmodel中的对象

    //在你的usercontrol中:

    public static readonly DependencyProperty CurrentItemProperty = 
     DependencyProperty.Register("CurrentItem", typeof(MyListBoxItemObject), 
    typeof(MyUserControl), new PropertyMetadata(default(MyListBoxItemObject)));
    
    public LiveTextBox CurrentItem
    {
        get { return (MyListBoxItemObject)GetValue(CurrentItemProperty ); }
        set { SetValue(CurrentItemProperty , value); }
    }
    

    //在你的窗口xaml

    <MyUserControl CurrentItem={Binding MyCurrentItem} ... />