2012-12-19 26 views
0

我有一個User controllist 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

你爲什麼不處理[ListBox.SelectionChanged](http://msdn.microsoft.com/en-us/library/ee436046.aspx)事件? – Ramin

+0

@Ron:位於用戶控件中的列表框,我可以從主窗口中查看ListBox.SelectionChanged事件 – KF2

+0

您是否有權訪問用戶控制代碼或其第三方控件? – alfoks

回答

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. 實現你的用戶控件的SelectionChanged事件,並提高您在窗口處理自定義事件:

    //在你的用戶控件

    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所選擇的項目綁定到對象

    //你的用戶控件:

    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} ... /> 
    
相關問題