2011-01-12 37 views
2

私はWPFプログラムでカスタム検索ダイアログを実装しようとしています。親ウィンドウは、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(); 
} 
そのようselectIndexを呼び出そうと子ウィンドウ(searchForm)で次に

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は、検索がループする観察可能なコレクションです。私は検索ロジックが動作しているが、私はFocus()親ウィンドウ内のListViewのインデックスとは思えない。

私の最初の考えは、インデックスを渡すことができる公開関数を持っていて、それが焦点を当てることでしたが、親ウィンドウにある子ウィンドウから関数を呼び出す方法を見つけることができないようです。

私はこれに完全に間違っていますか?この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; 
+0

私はとても素敵です。 –

+0

ありがとう!非常にきれいで「正しい」感じ。 – WSkid

4

のようにOwnerを設定した場合、(Owner as MyWindowDerivative).Method()(オーナーのタイプがWindowの場合)を介してダイアログ内のパブリックメソッドを呼び出すことができるはずです。

編集:そのルートに行く場合は、Ownerが常にタイプMyWindowDerivativeであることを確認する必要があります。 Owner-Propertyを上書きすることによって、パラメータのないコンストラクタも防ぎます。

+0

私はこれが提起され、もう少しコードとエラーメッセージを追加しました。 – WSkid

+0

オーナーウィンドウをキャストまたはアンボックスしましたか?私はそれを最初に追加するのを忘れました.... –

+2

その問題は、searchFormがMyWindowDerivativeに依存し、searchFormが別のタイプのウィンドウで生成できないことです。それについて気にしないなら、このソリューションはうまく動作します。 – Jacob

関連する問題