web-dev-qa-db-ja.com

WPF Get parent window

やあ、

MainWindow.xaml.csファイルで、リストボックスへの参照を取得するゲッターを作成しました。

public ListBox LoggerList
{
    get { return Logger; }
}    

今、通常のクラスからLoggerListにアクセスしたいのですが、動作しません。私は次を試しました:

MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
object selectedItem = parentWindow.LoggerList;

ただし、これは* xaml.csファイルでのみ機能し、通常の* .csファイルでは機能しません。

宜しくお願いします

13
user2644964

WPFでWindowsにアクセスする方法はいくつかあります。いくつか開いている場合は、次のように繰り返し処理できます。

foreach (Window window in Application.Current.Windows) window.Close();

特定のタイプのカスタムWindowがある場合、これを使用できます。

foreach (Window window in Application.Current.Windows.OfType<YourCustomWindow>()) 
    ((YourCustomWindow)window).DoSomething();

MainWindowへの参照の直後にいる場合、単純にこれを使用できます。

Window mainWindow = Application.Current.MainWindow;

ただし、このメソッドを使用すると、nullを返す可能性があります。この場合、コンストラクターでこのプロパティにMainWindowを必ず設定してください。

// From inside MainWindow.xaml.cs
Application.Current.MainWindow = this;

ただし、@ woutervsは正しいことに注意してください... notライブラリクラスのWindowsからUIコントロールにアクセスする必要があります。本当にコレクションをListBox.ItemsSourceにデータバインドしてから、代わりにデータコレクションを操作する必要があります。


更新>>

Application.Currentオブジェクトがnullである理由がわかりません...クラスライブラリを別のAppDomainにロードしたことが原因の可能性があります。いずれにせよ、あなたは全体像を見逃していると思います。クラスライブラリクラスがメインWindowへの参照を必要とする理由はまったくありません。

データコレクションで何らかの作業を実行する必要がある場合は、コードビハインドまたはビューモデルからデータコレクションを渡すだけです。作業が完了したら、ListBoxおよび/またはItemsSourceプロパティにデータバインドされたコレクションにアクセスできるUIにそれを渡すだけです。

17
Sheridan