事件识别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。那你就不需要通过二级考试了。我也会使用一个界面,公开它在第一个模型中需要更新的内容,因此没有访问第一个模型的所有权限。谢谢你的工作我让它这样工作,但我希望有一个更简单的方式像一个全球活动。谢谢你的工作我让它这样工作,但我希望有一个更简单的方式像一个全球活动。