在我的App.xaml.cs中,我有一个全局视图模型
public partial class App : Application
{
public static ViewModel viewModel = new ViewModel();
}
我总是在后面的代码中设置数据上下文
public MainWindow(){
...
DataContext = App.viewModel;
...
}
但是我想在XAML中尝试做同样的事情。如何从XAML中选择类和静态属性? 到目前为止,我的UserControl
<UserControl ...
xmlns:global="clr-namespace:MyMainNamespace"
(应用程序将在此命名空间下,如此MyMainNamespace.App)
然后我可以选择应用程序&#39;这样的全球就好了
<UserControl.Resources>
<global:App x:Key="test"></global:App>
</UserControl.Resources>
<UserControl.DataContext>
??
</UserControl.DataContext>
在用户控件中,我有一个组合框,我想绑定到viewModel中的可观察集合
<Grid>
<ComboBox Width="150" Height="25" HorizontalAlignment="Left" VerticalAlignment="Top" ></ComboBox>
</Grid>
编辑:我试图在这个答案之后模拟我的解决方案 https://stackoverflow.com/a/23714054/1462656
但我找不到从App中选择viewModel对象的方法,而不会给我语法错误
答案 0 :(得分:1)
您可以使用StaticResource
的{{1}}绑定绑定到您的资源,并使用绑定的Source
从中获取属性,如下所示:
Path
如果确实想要“附加”格式的<UserControl ...Existing attributes... DataContext="{Binding Source={StaticResource test},
Path=viewModel}">
,您可以这样做:
DataContext
...但你必须使<UserControl.DataContext>
<Binding Path="viewmodel" Source="{StaticResource test}" />
</UserControl.DataContext>
成为一个实际的属性,它不会作为一个字段。您的代码也可能生成viewModel
InvalidOperationException:无法创建多个 System.Windows.Application实例位于同一AppDomain中。
如果InvalidOperationException
是从App
生成的应用程序类,因为用于声明资源的格式将创建它的新实例。即使使用上面的“内联”语法,也会发生这种情况。它不是由绑定引起的,而是由资源声明引起的。
我的首选这样做的方法是为实现App.xaml.cs
的控件创建一个视图模型类,让我们只为它调用它INotifyPropertyChanged
。然后像这样设置MyControlVm
:
DataContext
这样,您就可以拥有<UserControl.DataContext>
<local: MyControlVm />
</UserControl.DataContext>
的多个实例,而不会让它们共享相同的状态(UserControl
属性static
)。