从子窗口调用父窗口中的函数

时间:2011-01-12 21:18:03

标签: c# wpf

我正在尝试在WPF程序中实现自定义搜索对话框。 Parent窗口是一个绑定到Observable Collection的ListView。

我用搜索表单创建了一个新窗口,它被初始化为:

searchForm sf = new searchForm(_QPCollection);
sf.Owner = this;
sf.Show();

我有这个函数我试图调用(在所有者窗口中):

public void selectIndex(int index)
{
    ListViewItem toSelect = listView1.Items[index] as ListViewItem;
    toSelect.Focus();
}

然后在子窗口(searchForm)中尝试调用selectIndex,如下所示:

public void SearchJob_Click(object sender, RoutedEventArgs e)
{
    if (sJob.Text == "" || sJob.Text == null) { return; }
    for (int i = findCount; i < _QPCollectionSearch.Count; i++)
    {
        if (i == _QPCollectionSearch.Count - 1) { i = 0; }
        if (_QPCollectionSearch[i].jobNumAndFlow.IndexOf(sJob.Text) > -1)
        {
            findCount = i;
            Owner.selectIndex(i);
        }

    }
}

我收到错误:System.Windows.Window不包含“selectIndex”的定义。

_QPCollection是搜索将循环的可观察集合。我有搜索逻辑工作,但我看起来Focus()是父窗口中ListView的索引。

我的第一个想法是有一个公共函数,我可以将索引传递给它,它会做焦点,但我似乎无法找到一种方法从父窗口中的子窗口调用函数。

我接近这个完全错了吗?这个answer似乎适用于WinForms,但我确信有一种方法可以在WPF中访问父窗口及其公共功能/属性。

2 个答案:

答案 0 :(得分:7)

处理该方案的更简洁方法是让searchForm举起活动。父窗口可以侦听该事件并将焦点设置在自己的列表视图中:

public class searchForm 
{
    public event EventHandler<SearchEventArgs> SearchResultSelected = delegate { };
}

public class SearchEventArgs : EventArgs
{
    public int Index { get; set; }
}

searchForm sf = new searchForm(_QPCollection);
sf.SearchResultSelected += (s, e) => MyListView.SelectedIndex = e.Index;

答案 1 :(得分:4)

如果像你一样设置Owner,你应该可以通过(Owner as MyWindowDerivative).Method()在对话框内调用公共方法(如果所有者属于Window类型),究竟是什么停止你这样做了吗?

编辑:如果您打算走这条路线,您应该确保Owner始终属于MyWindowDerivative类型,例如通过覆盖Owner-Property,也可以防止无参数构造函数。