2011-01-12 126 views
2

我試圖在WPF程序中實現自定義搜索對話框。父窗口是綁定到Observable集合的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); 
     } 

    } 
} 

我得到的ER ror:System.Windows.Window不包含「selectIndex」的定義。

_QPCollection是搜索將循環瀏覽的集合。我有搜索邏輯工作,但我似乎無法在父窗口中ListView的索引Focus()

我的第一個想法是有一個公共職能,我可以通過索引,它會做的重點,但我似乎無法找到一種方法來調用父窗口中的子窗口的功能。

我接近這完全錯了嗎?這個answer似乎是用於WinForms,但我確定有一種方法可以訪問WPF中的父窗口及其公共函數/屬性。

回答

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; 
4

如果設置了Owner像你這樣,你應該能夠通過(Owner as MyWindowDerivative).Method()調用對話中的公共方法(如果業主是Window型),究竟是從這樣做,阻止你?

編輯:如果你打算去那條路線,你應該確保Owner總是類型MyWindowDerivative,例如,通過覆蓋Owner-Property,也可以防止無參數的構造函數。

+0

我更增添了幾分代碼和錯誤信息,這引起了 - 它不具有法的定義() 。 – WSkid 2011-01-12 21:30:03

+0

您是否投出或解除了所有者窗口的權利?我忘了添加最初.... – 2011-01-12 21:33:21