我正在尝试在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中访问父窗口及其公共功能/属性。
答案 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,也可以防止无参数构造函数。