我有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
吗?
答案 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)
有几种方法可以解决这个问题:
在您的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();
如果您使用绑定或任何形式的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} ... />