Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件识别C#WPF_C#_Wpf_Events_Eventhandler - Fatal编程技术网

事件识别C#WPF

事件识别C#WPF,c#,wpf,events,eventhandler,C#,Wpf,Events,Eventhandler,我对事件有意见。我得到了第一个窗口,它看起来像这样: using System.Windows; namespace EventsTests { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow()

我对事件有意见。我得到了第一个窗口,它看起来像这样:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public void raiseEventFromSecondPage_EventHandler()
    {
         MessageBox.Show("MAINWINDOW Event Fired");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         SecondPage sp = new SecondPage();
         sp.raiseEventFromSecondPage += raiseEventFromSecondPage_EventHandler();
         sp.Show();
    }
}
现在我想,当我单击第二页上的按钮时,事件将被触发,主窗口将识别该事件。 使用此代码,我得到了错误:

错误1无法分配给“RaiseEvent”,因为它是“方法组”

有人能帮我吗?或者给我举个例子

谢谢你的提示;)

不是您的事件,它是
窗口的一种方法

我想你应该这样做:

SecondPage sp = new SecondPage();
sp.raiseEvent += raiseEvent_EventHandler;    
sp.Show();
也就是说,向第二个页面事件注册一个事件处理程序

尽管我不主张使用
事件
处理程序。虽然我不知道您想要实现什么,但我宁愿将ViewModel对象传递给
SecondPage
,主窗口可以响应该ViewModel上的状态更改

在WPF中,我的目标始终是代码隐藏

作为对讨论的回应,一个VM如何能够引用另一个VM。首先将VM传入:

SecondPageViewModel spvm;
public SecondPage(SecondPageViewModel model)
{
    spvm = model;
    this.DataContext = spvm;
    InitializeComponent();
}
然后,SecondpageVM将MainVM作为构造函数中的参数:

SecondPage sp = new SecondPage(new SecondPageViewModel(mainVM));
主模型的更新在
SecondPageViewModel
中完成。第二页本身没有对它的引用

ThirdPage tp = new ThirdPage(new ThirdPageViewModel(spvm))
第三页虚拟机可以通过第二页虚拟机上的属性访问主页虚拟机:
spvm.MainVm

不是您的事件,它是
窗口的一种方法

我想你应该这样做:

SecondPage sp = new SecondPage();
sp.raiseEvent += raiseEvent_EventHandler;    
sp.Show();
也就是说,向第二个页面事件注册一个事件处理程序

尽管我不主张使用
事件
处理程序。虽然我不知道您想要实现什么,但我宁愿将ViewModel对象传递给
SecondPage
,主窗口可以响应该ViewModel上的状态更改

在WPF中,我的目标始终是代码隐藏

作为对讨论的回应,一个VM如何能够引用另一个VM。首先将VM传入:

SecondPageViewModel spvm;
public SecondPage(SecondPageViewModel model)
{
    spvm = model;
    this.DataContext = spvm;
    InitializeComponent();
}
然后,SecondpageVM将MainVM作为构造函数中的参数:

SecondPage sp = new SecondPage(new SecondPageViewModel(mainVM));
主模型的更新在
SecondPageViewModel
中完成。第二页本身没有对它的引用

ThirdPage tp = new ThirdPage(new ThirdPageViewModel(spvm))

第三页虚拟机可以通过第二页虚拟机上的属性访问主页虚拟机:
spvm.MainVm

MainWindow
中,您正在尝试订阅一个窗口方法,而不是
raiseEvent
。当然,您不需要实例化另一个
main窗口

您的
main窗口
代码应该如下所示:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public void raiseEventFromSecondPage_EventHandler()
    {
         MessageBox.Show("MAINWINDOW Event Fired");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         SecondPage sp = new SecondPage();
         sp.raiseEventFromSecondPage += raiseEventFromSecondPage_EventHandler();
         sp.Show();
    }
}
然后需要
SecondPage
公开
raiseEvent
。这将是一个不同于其ViewModel中的事件,但您将链接这两个事件

public partial class SecondPage : Window
{
    SecondPageViewModel spvm = new SecondPageViewModel();

    public event raiseEventEventHandler raiseEventFromSecondPage;

    public SecondPage()
    {
        this.DataContext = spvm;
        spvm.raiseEvent += raiseEvent_EventHandler;
        InitializeComponent();
    }

    public void raiseEvent_EventHandler()
    {
        if (raiseEventFromSecondPage != null)
            raiseEventFromSecondPage();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        spvm.raiseEventActivate();
    }
}

main窗口中
您试图订阅一个窗口方法,而不是
raiseEvent
。当然,您不需要实例化另一个
main窗口

您的
main窗口
代码应该如下所示:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public void raiseEventFromSecondPage_EventHandler()
    {
         MessageBox.Show("MAINWINDOW Event Fired");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         SecondPage sp = new SecondPage();
         sp.raiseEventFromSecondPage += raiseEventFromSecondPage_EventHandler();
         sp.Show();
    }
}
然后需要
SecondPage
公开
raiseEvent
。这将是一个不同于其ViewModel中的事件,但您将链接这两个事件

public partial class SecondPage : Window
{
    SecondPageViewModel spvm = new SecondPageViewModel();

    public event raiseEventEventHandler raiseEventFromSecondPage;

    public SecondPage()
    {
        this.DataContext = spvm;
        spvm.raiseEvent += raiseEvent_EventHandler;
        InitializeComponent();
    }

    public void raiseEvent_EventHandler()
    {
        if (raiseEventFromSecondPage != null)
            raiseEventFromSecondPage();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        spvm.raiseEventActivate();
    }
}

谢谢你的帮助。通过将ViewModel传递到第二个窗口,我可以实现这一点。但是我正在做一个项目,第二个窗口是从第三个窗口使用的。从第一个窗口打开。当我按照逻辑传递ModelView时,我需要将2个Viewmodels传递给thirdWindow,以便主窗口可以响应事件。很好,这也更安全,事件可能会导致泄漏:(虽然不是在您的情况下)如果它回答了您的问题,请标记为已接受。您的第二个viewmodel可以引用第一个viewmodel。那你就不需要通过二级考试了。我也会使用一个界面,在第一个模型中公开它需要更新的内容,所以没有访问第一个的权限。谢谢你的帮助。通过将ViewModel传递到第二个窗口,我可以实现这一点。但是我正在做一个项目,第二个窗口是从第三个窗口使用的。从第一个窗口打开。当我按照逻辑传递ModelView时,我需要将2个Viewmodels传递给thirdWindow,以便主窗口可以响应事件。很好,这也更安全,事件可能会导致泄漏:(虽然不是在您的情况下)如果它回答了您的问题,请标记为已接受。您的第二个viewmodel可以引用第一个viewmodel。那你就不需要通过二级考试了。我也会使用一个界面,公开它在第一个模型中需要更新的内容,因此没有访问第一个模型的所有权限。谢谢你的工作我让它这样工作,但我希望有一个更简单的方式像一个全球活动。谢谢你的工作我让它这样工作,但我希望有一个更简单的方式像一个全球活动。