Можно ли захватывать события из выпадающего списка WPF в форме win? - PullRequest
0 голосов
/ 14 марта 2011

Я реализовал комбинированный список wpf в winform, и теперь мне нужно каким-то образом заставить его вызывать функцию или событие в моей winform при изменении поля, а также иметь возможность изменять значение из winform.

main:

namespace main
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ElementHost elhost = new ElementHost();
            elhost.Size = new Size(174, 24);
            elhost.Location = new Point(93,60);
            MyWPFControl wpfctl = new MyWPFControl();
            elhost.Child = wpfctl;
            this.Controls.Add(elhost);
            elhost.BringToFront();
        }


        public void status_change(int val)
        {
            MessageBox.Show("Box value has changed to:" + Convert.ToString(val)   );
        }

и wpf:

namespace main
{
    /// <summary>
    /// Interaction logic for MyWPFControl.xaml
    /// </summary>
    public partial class MyWPFControl : UserControl
    {
        public MyWPFControl()
        {
            InitializeComponent();

        }


        private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            main.status_change(statComboBox.SelectedIndex);
            /// says:
            /// Error   1   The type or namespace name 'status_change' does not exist in the namespace 'main' (are you missing an assembly reference?)  C:\Users\Robert\documents\visual studio 2010\Projects\XMPP\main\wpf_combo_status.xaml.cs    31  18  main

        }


    }
    }

Есть идеи, что я могу делать не так?Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Выставить событие в MyWPFControl как:

public SelectionChangedEventArgs:EventArgs
{
    public int SelectedIndex {get; private set;}
    public SelectionChangedEventArgs (int selIdx)
    {
        this.SelectedIndex = selIdx;
    }
}

public partial class MyWPFControl : UserControl
{
    public event EventHandler<SelectionChangedEventArgs> SelectionChanged;

    public MyWPFControl()
    {
        InitializeComponent();
    }

    private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        OnSelectionChanged(statComboBox.SelectedIndex);
    }

    private void OnSelectionChanged(int selIdx)
    {
        if (SelectionChange != null)
            SelectionChanged(this, new SelectionChangedEventArgs(selIdx));
    }
}

Затем подпишите его в форме, например:

public Form1()
{
    InitializeComponent();

    ElementHost elhost = new ElementHost();
    elhost.Size = new Size(174, 24);
    elhost.Location = new Point(93,60);
    MyWPFControl wpfctl = new MyWPFControl();
    elhost.Child = wpfctl;
    this.Controls.Add(elhost);
    elhost.BringToFront();

    wpfctl.SelectionChanged += myWPFControls_SelectionChanged;
}

private void myWPFControls_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    status_change(e.SelectedIndex);
}

P.S:.

Я не могу проверить это, поэтому могут быть некоторые ошибки, но просто чтобы дать вам идею ...;)

2 голосов
/ 14 марта 2011

Трудно сказать без контекста, но может показаться, что код, который вам нужен, вероятно:

private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    main.status_change(statComboBox.SelectedIndex);
}

Предполагая, что main является экземпляром Form1, для которого вы хотите вызвать status_change.

...