代码之家  ›  专栏  ›  技术社区  ›  erotavlas

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

  •  1
  • erotavlas  · 技术社区  · 8 年前

    在我的应用程序中。xaml。cs我有一个全局视图模型

    public partial class App : Application
    {
        public static ViewModel viewModel = new ViewModel();
    }
    

    我总是在代码后面这样设置数据上下文

    public MainWindow(){
      ...
      DataContext = App.viewModel;
      ...
    }
    

    然而,我想尝试在XAML中做同样的事情。如何从XAML中选择类和静态属性? 到目前为止,我的用户控制

    <UserControl ...
             xmlns:global="clr-namespace:MyMainNamespace"
    

    (应用程序将位于该命名空间下,如MyMainNamespace.App)

    然后我可以像这样从global中选择“App”

    <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

    但我无法找到从应用程序中选择viewModel对象的方法,因为它不会给我语法错误

    1 回复  |  直到 8 年前
        1
  •  1
  •   Bradley Uffner    8 年前

    StaticResource 对的绑定 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

    系统窗户。同一AppDomain中的应用程序实例。

    如果 App 您的应用程序类是从 App.xaml.cs ,因为您用于声明资源的格式将创建它的新实例。即使使用上面的“内联”语法,也会发生这种情况。它不是由绑定引起的,而是由资源声明引起的。


    我的 首选 这样做的方法是只为实现的控件创建一个视图模型类 INotifyPropertyChanged ,我们就叫它吧 MyControlVm 举个例子。然后设置 数据上下文 这样地:

    <UserControl.DataContext>
        <local: MyControlVm />
    </UserControl.DataContext>
    

    这将允许您拥有多个 UserControl 没有他们都共享相同的状态(作为您的 static 的属性 应用程序 会)。