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または、From Myフォームでリストボックスを検出するより良い方法はありますか?

4

2 に答える 2

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;
  }
}
于 2012-12-19T09:47:44.223 に答える
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} ... />
    
于 2012-12-19T09:49:54.480 に答える