установка контекста данных для представления в элементе вкладки

в моих оконных ресурсах у меня есть шаблон данных для моей модели представления и статическая модель основного представления

<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 на экземпляр DatabaseViewModel, который находится внутри моего SharedSettingsViewModel?

на мой взгляд, 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");
                }
            }
}

person FPGA    schedule 19.10.2013    source источник


Ответы (1)


Вам нужно будет обновить код, как показано ниже, и ваш DatabaseViewModel станет DataContext вашего DatabaseView, который будет DataTemplate для Content из ContentPresenter в ContentTemplate вашего 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>
person Nitin    schedule 19.10.2013