我的MainWindow中有一些公共属性/对象(此窗口设置为我的启动对象)。我希望能够从该窗口内显示的视图中绑定到这些属性。
我可以在我的代码隐藏中使用以下代码,它可以工作。
this.DataContext = ((MainWindow)((App)Application.Current).MainWindow).TippingSourceCollection;
我想用XAML做同样的事情。
谁能告诉我怎么样?
谢谢 约翰
答案 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}}}" />