【问题标题】:setting datacontext for a view in a tab item为选项卡项中的视图设置数据上下文
【发布时间】:2013-10-28 07:40:11
【问题描述】:

在我的窗口资源中,我有一个视图模型的数据模板和一个静态主视图模型

<Window.Resources>
        <DataTemplate DataType="{x:Type SharedViewModels:DatabaseViewModel}">
            <SharedViews:DatabaseView/>
        </DataTemplate>

        <LocalViewModels:SharedSettingsViewModel x:Key="SharedSettingsViewModel"/>
</Window.Resources>

DatabaseViewModel 是我的静态 SharedSettingsViewModel 中的一个实例 我有这个标签控件

<TabControl DataContext="{Binding Source={StaticResource SharedSettingsViewModel}}" ItemsSource="{Binding SharedSettingsViewModelsTabList}">
                        <TabControl.ItemTemplate>
                            <DataTemplate>
                                <ContentPresenter Content="{Binding Content}"/>
                            </DataTemplate>
                        </TabControl.ItemTemplate>
                    </TabControl>

然后我像这样将项目添加到我的 TabControl 项目中

SharedSettingsViewModelTabList.Add(new Shared.Models.TabItem() { Header = "Sql Databases", Content = DatabaseViewModel });

如何将我的DatabaseView 的数据上下文设置为我的SharedSettingsViewModel 内的DatabaseViewModel 实例?

在我看来 DatabaseView XAML 是我尝试过的用户控件

DataContext="{Binding DatabaseViewModel}"

但这似乎不起作用

这是我的 TabItem 模型

public class TabItem : MVVM.ObservableObject
    {
        public string Header { get; set; }
        public MVVM.ObservableObject Content { get; set; }
    }

我的 DatabaseViewModel 将被定义为 SharedSettingsViewModel 中的一个属性

 private ObservableCollection<Models.Database> databases;

 public ObservableCollection<Models.Database> Databases
        {
            get
            {
                if (databases == null)
                {
                    databases = new ObservableCollection<Models.Database>();
                    databases.Add(new Models.Database() { Displayname = "new" });
                }
                return databases;
            }
            set
            {
                SetField(ref databases, value, "Databases");
            }
        }

这是我的 SharedSettingsViewModel,其中包含选项卡项集合

public class SharedSettingsViewModel : MVVM.ObservableObject 
    {
    private ObservableCollection<Shared.Models.TabItem> SharedSettingsViewModelTabList;
    public ObservableCollection<Shared.Models.TabItem> SharedSettingsViewModelTabList
            {
                get
                {
                    if (sharedSettingsViewModelTabList == null)
                    {
                        sharedSettingsViewModelTabList = new ObservableCollection<Shared.Models.TabItem>();
                    }
                    return sharedSettingsViewModelTabList;
                }

            }

    //my DatabaseViewModel property..as a child view model

            private Shared.ViewModels.DatabaseViewModel databaseViewModel;
            public Shared.ViewModels.DatabaseViewModel DatabaseViewModel
            {
                get
                {
                    if (databaseViewModel == null)
                    {
                        databaseViewModel = new Shared.ViewModels.DatabaseViewModel();
                    }
                    return databaseViewModel;
                }
                set
                {
                    SetField(ref databaseViewModel, value, "DatabaseViewModel");
                }
            }
}

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    您必须更新如下代码,您的DatabaseViewModel 将成为您的DatabaseViewDataContext,这将是您的ContentTemplateContentPresenterContentDataTemplate TabControl

           <TabControlDataContext="{Binding Source={StaticResource SharedSettingsViewModel}}" ItemsSource="{Binding SharedSettingsViewModelsTabList}">
                <TabControl.ContentTemplate>
                       <DataTemplate>
                            <ContentPresenter Content="{Binding Content}"/>
                        </DataTemplate>
                </TabControl.ContentTemplate>
                <TabControl.ItemContainerStyle>
                    <Style TargetType="TabItem">
                        <Setter Property="Header" Value="{Binding Header}"/>
                    </Style>
                </TabControl.ItemContainerStyle>
            </TabControl>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      相关资源
      最近更新 更多