【问题标题】:Event recognition C# WPF事件识别 C# WPF
【发布时间】:2015-07-23 15:26:31
【问题描述】:

我遇到了事件问题。我得到了第一个窗口,它看起来像这样:

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();
        }
    }
}

现在第二个页面做的不多:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for SecondPage.xaml
    /// </summary>
    public partial class SecondPage : Window
    {
        SecondPageViewModel spvm = new SecondPageViewModel();
        public SecondPage()
        {
            this.DataContext = spvm;
            InitializeComponent();
        }

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

最后我有了 SecondPageViewModel:

namespace EventsTests
{
    public delegate void raiseEventEventHandler();

    class SecondPageViewModel 
    {
        public event raiseEventEventHandler raiseEvent;
        public void raiseEventActivate()
        {
            if(raiseEvent != null)
            {
                raiseEvent();
            }
        }
    }
}

现在我想,当我单击第二页上的按钮时,会触发事件,并且 MainWindow 会识别该事件。 使用此代码,我得到错误:

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

有人可以帮助我吗?或者举个例子?

感谢您的每一个提示;)

【问题讨论】:

    标签: c# wpf events eventhandler


    【解决方案1】:

    RaiseEvent 不是你的事件,它是Window 的一个方法。

    我想你想这样做:

    SecondPage sp = new SecondPage();
    sp.raiseEvent += raiseEvent_EventHandler;    
    sp.Show();
    

    即用第二页事件注册一个事件处理程序。

    虽然我不会为此提倡 event 处理程序。虽然我不知道你想要实现什么,但我宁愿做一些事情,比如将 ViewModel 对象传递给SecondPage,主窗口可以响应该 ViewModel 上的状态变化。

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

    作为对讨论的回应,一个虚拟机如何引用另一个虚拟机。首先传入虚拟机:

    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

    【讨论】:

    • 感谢您的帮助。通过将 ViewModel 传递给 SecondWindow,我可以让它工作。但我正在开发一个从第三个窗口使用 SecondWindow 的项目。从 FirstWindow 打开。当我遵循传递ModelView的逻辑时,我需要将2个Viewmodel传递给thirdWindow,以便MainWindow可以响应事件。
    • 好,它也更安全,事件可能导致泄漏:stackoverflow.com/questions/4526829/…(虽然不是你的情况)如果它回答了你的问题,请标记为接受。
    • 您的第二个视图模型可以参考第一个。那么你不需要通过两个。我还将使用一个接口来公开它需要在第一个模型中更新的内容,因此没有对 first 的所有访问权限。
    【解决方案2】:

    MainWindow 中,您尝试订阅 Window 方法,而不是您的 raiseEvent。当然你不需要实例化另一个MainWindow...

    您的MainWindow 代码应该是这样的:

    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();
        }
    }
    

    【讨论】:

    • 谢谢你的工作,我得到了这样的工作,但我希望有一种更简单的方式,比如全球活动。
    猜你喜欢
    • 2018-10-08
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多