如果在WPF中的另一个窗口上触发某个事件,如何在一个窗口上更新列表。 我只是想知道如何从另一个窗口听一个窗口的事件。
答案 0 :(得分:0)
到目前为止您尝试了什么?
是否有一个窗口创建另一个窗口?
通常我会调用子窗口的方法。 如果子窗口想要触发父窗口,则应该使用事件完成。
喜欢:伪
public class FormParent : Form
{
public void OpenChild()
{
// create the child form
FormChild child = new FormChild();
// register the event
child.DataUpdated += Child_DataUpdated;
// ....
// parent to child (method call)
child.DoSomething();
}
public void Child_DataUpdated(object sender, EventArgs e)
{
// refresh the list.
}
}
public class FormChild : Form
{
public void DoSomething()
{
// ....
// if the list should be refreshed.
// call event from child to parent.
if(DataUpdated != null)
DataUpdated(this, EventArgs.Empty);
}
public event EventHandler DataUpdated;
}
请记住,父母知道孩子的结构。 (方法调用) 孩子,对父母的结构(事件)一无所知
通过这种方式,您可以在不同的解决方案中重复使用子项(不依赖于代码)
答案 1 :(得分:0)
您必须将对象传递给新窗口,然后在第二个窗口为它创建一个新的事件处理程序。
第一个窗口代码:
public FirstWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SecondWindow sWindow = new SecondWindow(btnFirstWindow);
sWindow.Show();
}
第二个窗口代码:
private Button firstWindowButton;
public SecondWindow(Button firstWindowButton)
{
this.firstWindowButton = firstWindowButton;
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
firstWindowButton.Click += firstWindowButton_Click;
}
void firstWindowButton_Click(object sender, RoutedEventArgs e)
{
lblShowUser.Content = "First window button clicked on: " + DateTime.Now.ToString();
}
我已经为第一个窗口添加了一个列表,并为您添加了第二个窗口中的事件:
这是第一个Windows代码:
public FirstWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
String[] items = { "Item 1", "Item 2", "Item 3" };
listItems.ItemsSource = items;
SecondWindow sWindow = new SecondWindow(btnFirstWindow, listItems);
sWindow.Show();
}
第二个Windows代码:
private Button firstWindowButton;
private ListBox firstWindowListBox;
public SecondWindow(Button firstWindowButton, ListBox firstWindowListBox)
{
this.firstWindowButton = firstWindowButton;
this.firstWindowListBox = firstWindowListBox;
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
firstWindowButton.Click += firstWindowButton_Click;
firstWindowListBox.MouseDoubleClick += firstWindowListBox_MouseDoubleClick;
}
void firstWindowListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (firstWindowListBox.SelectedItem != null)
{
lblShowUser.Content = "First window list box selected item: " + firstWindowListBox.SelectedItem.ToString();
}
}
void firstWindowButton_Click(object sender, RoutedEventArgs e)
{
lblShowUser.Content = "First window button clicked on: " + DateTime.Now.ToString();
}
答案 2 :(得分:0)
这基本上是在两个窗口之间传递数据的问题。 Sender 是具有触发器的窗口, receiver 是一个什么过程。
当窗口之一应该知道其他窗口时,您可以使用耦合解决方案。如果您将接收方的实例传递给发送方,则发送方将能够调用接收方的公共方法。如果你将发送者的实例传递给接收者,那么接收者可以订阅公共控制事件(不要这样做)或特殊的专用形式事件(仅仅因为这个原因 - 触发其他地方的事情)。
解耦解决方案是具有单独的类(提供程序?),它公开事件和方法以触发该事件。接收方将订阅事件,发送方将触发它,没有人知道彼此,没有人必须触发或订阅。