2014-04-04 93 views
8

Hy,WPF获取父窗口

在我的MainWindow.xaml.cs文件中,我做了一个getter以获取对我的列表框的引用。

public ListBox LoggerList 
{ 
    get { return Logger; } 
}  

现在我想从普通类访问LoggerList,但我不工作。我试过以下内容:

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

但是,这只适用于* xaml.cs文件而不是正常的* .cs文件。

问候

+0

一个WPF列表框是绑定的,而不是有一个属性,您列表框,你应该有一个属性包含您的项目源,并将其绑定到列表框(LoggerList.ItemSource = myList中;然后,你就可以绑定你你可以使用它们,你现在处理它的方式是不正确的,你应该看看绑定和基本的WPF示例。 – woutervs

+3

试试这个:'window parentWindow = Application.Current。 MainWindow'。 –

+0

Hy,试着用Window parentWindow = Application.Current.MainWindow。但是我不能得到LoggerList。 – user2644964

回答

13

有一些在WPF访问Window S的方式。如果你有几个开放的,那么你可以遍历它们是这样的:如果你是刚吃完

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

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

如果你有一个特定类型的自定义Window的,你可以使用这个参考MainWindow,那么你可以简单地使用:

Window mainWindow = Application.Current.MainWindow; 

但是,使用这种方法,有机会的话,它会返回null。在这种情况下,请确保您设置MainWindow这个属性在它的构造函数:

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

但是,应该注意的是,@woutervs是正确的...你应该Window访问UI控件s在图书馆类。您确实应该将数据绑定到ListBox.ItemsSource,然后改为处理数据收集。


UPDATE >>

我不知道为什么你的Application.Current对象是null ......这可能是因为你已经加载了类库到不同的AppDomain。无论如何,我认为你错过了大局。实际上,没有理由为什么一个类库类应该需要引用主要的Window

如果您需要在数据收集上执行一些工作,那么只需从后面的代码或视图模型传递数据收集。工作完成后,只需将其传回到可访问ListBox和/或与ItemsSource属性数据绑定的集合的UI。

+0

Hy,用Window parentWindow = Application.Current.MainWindow试了一下。但我无法获得LoggerList。 \t 我需要这个,因为我想在自动滚动列表框后添加一个元素:LoggerList.ScrollIntoView(LoggerList.Items [LoggerList.Items.Count - 1]); – user2644964

+0

请再次阅读我的第二个最后一段。 – Sheridan

+0

Hy,我也将MainWindow设置为它的构造函数中的这个属性。是的,我将可观察集合绑定到列表,但列表框不会自动滚动绑定。你是指那个还是别的? – user2644964