繁体   English   中英

WPF:绑定选项卡控件

[英]WPF: Bind Tab Control

我正在使用MVVM,并且试图绑定TabControl's ItemsSource ,我使用了以下代码:

<TabControl ItemsSource="{Binding ProjectComponents}"
                    SelectedIndex="{Binding SelectedMenu, Mode=TwoWay}" Grid.Column="1" Margin="5">

对于视图模型:

projectComponents = new ObservableCollection<TabItem>();
projectComponents.Add(new TabItem()
{

     Content = new ProjectComponentsView()
     {
          DataContext = new ProjectClientHandlerViewModel()
     }
});

我在Silverlight项目中使用了它,并且效果很好,但是在WPF ,我不知道为什么TabItem的内容不显示是为什么。

编辑:

我将代码编辑为:

视图:

 <TabControl ItemsSource="{Binding ProjectComponents}" SelectedIndex="{Binding SelectedMenu, Mode=TwoWay}" Grid.Column="1" Margin="5">
        <TabControl.ContentTemplate>
            <DataTemplate >
                <this:ProjectComponentsView DataContext="{Binding}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
 </TabControl>

查看模型:

projectComponents = new ObservableCollection<ProjectComponentViewModel>();
projectComponents.Add(new ProductViewsHandlerViewModel());

其中ProjectComponentViewModelProductViewsHandlerViewModel的基类,但仍无法正常工作。

这是一个快速入门的例子

public class MainVm : VMBase
    {
        public ObservableCollection<TabVM> Items { get; set; }
        public VMBase SelectedItem {get;set;} 
        public MainVm()
        {
            Items = new ObservableCollection<TabVM>()
            {
                new TabVM(){Header="A",Content = new SomeVm()},
                new TabVM(){Header="B",Content = new SomeVm()},
                new TabVM(){Header="C",Content = new SomeVm()},
                new TabVM(){Header="D",Content = new OtherVm()}
            };
        }
    }

    public class TabVM : VMBase
    {
        public string Header { get; set; }
        public VMBase Content { get; set; }
    }

    public class SomeVm : VMBase{}
    public class OtherVm : VMBase{}
    public class VMBase { }


<TabControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
        <TabControl.Resources>
            <DataTemplate DataType="{x:Type local:SomeVm}">
                <TextBlock>SomeVm Template</TextBlock>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:OtherVm}">
                <TextBlock>OtherVm Template</TextBlock>
            </DataTemplate>
        </TabControl.Resources>
        <TabControl.ItemTemplate>
            <DataTemplate>
                    <TextBlock Text="{Binding Header}"></TextBlock>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding Content}"></ContentControl>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

当我们在资源中进行设置时,模板是根据ViewModel类型选择的,因此,您还应该使用一个代表TabItemViewModel ,在上面的代码段中,该TabItemTabVM

在选项卡控件的ItemTemplate中,设置标题模板;在ContentTemplate ,放置ContentControl并将其Content绑定到TabVMContent属性。

并且不要忘记实现INotifyPropertyChanged

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM