如何将XAML中的数据上下文设置为全局静态变量?

时间:2017-11-24 20:08:52

标签: wpf xaml

在我的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对象的方法,而不会给我语法错误

1 个答案:

答案 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)。