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());
其中 ProjectComponentViewModel
是 ProductViewsHandlerViewModel
的基础 class,但它仍然无法正常工作。
这是一个让您入门的简单示例
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
类型选择的,您还应该使用代表 TabItem
的 ViewModel
,即 [=14] =] 在上面的片段中。
在选项卡控件的 ItemTemplate
中设置页眉模板,在 ContentTemplate
中放置 ContentControl
并将其 Content
绑定到 Content
属性 共 TabVM
。
并且不要忘记实施 INotifyPropertyChanged
。
我正在使用 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());
其中 ProjectComponentViewModel
是 ProductViewsHandlerViewModel
的基础 class,但它仍然无法正常工作。
这是一个让您入门的简单示例
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
类型选择的,您还应该使用代表 TabItem
的 ViewModel
,即 [=14] =] 在上面的片段中。
在选项卡控件的 ItemTemplate
中设置页眉模板,在 ContentTemplate
中放置 ContentControl
并将其 Content
绑定到 Content
属性 共 TabVM
。
并且不要忘记实施 INotifyPropertyChanged
。