使用XAML如何从另一个视图绑定到MainWindow的属性?

时间:2017-08-09 12:13:56

标签: c# wpf xaml

我的MainWindow中有一些公共属性/对象(此窗口设置为我的启动对象)。我希望能够从该窗口内显示的视图中绑定到这些属性。

我可以在我的代码隐藏中使用以下代码,它可以工作。

this.DataContext = ((MainWindow)((App)Application.Current).MainWindow).TippingSourceCollection;

我想用XAML做同样的事情。

谁能告诉我怎么样?

谢谢 约翰

3 个答案:

答案 0 :(得分:0)

从技术上讲,它可以通过与静态源绑定来实现

DataContext = "{Binding Source={x:Static Application.Current},
                        Path=MainWindow.TippingSourceCollection}"

但我建议为您的视图创建专门的ViewModel类/类

答案 1 :(得分:0)

如果您已将Window的DataContext设置为MainWindow对象,那么您肯定可以正常绑定到其属性...因此,请在Window的代码中尝试此操作:

DataContext = (MainWindow)((App)Application.Current).MainWindow;

然后在你的窗口的XAML中,做一下这样的事情:

<ListBox ItemsSource="{Binding TippingSourceCollection}" ... />

编辑&gt;&gt;&gt;

好的,所以你想要以'MVVM'的方式做到这一点。一种解决方案是将您的MainWindow属性放入所有视图模型都可以访问的基本视图模型类中。例如:

public class BaseViewModel { // declare your MainWindow properties here }

public class OtherViewModels : BaseViewModel { // specific properties here }

通过这种方式,您的所有视图模型都可以访问基本视图模型中声明的所有属性。但是...... 所有的视图模型都可以访问这些属性,并相应地扩大它们的内存占用量。

因此,我想指出MVVM没有规则说你不应该使用文件背后的代码来获得这样的设置代码。使用MVVM的主要原因是在UI和业务逻辑之间提供关注点分离,使我们能够单独测试它们。因此,建议您不要在代码后面放置任何业务逻辑,但是设置这样的UI属性根本不是问题。

答案 2 :(得分:0)

你可以尝试这样的事情。但是你的方法和试图实现/学习MVVM在主窗口上有这个集合可能有点缺陷,而不是在控件的viewmodel创建时可以访问的静态类。

<UserControl DataContext="{Binding TippingSourceCollection, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />