【发布时间】:2015-05-26 01:23:18
【问题描述】:
我有一个带有主视图 (Window) 的 wpf 程序,其中包含一个 TabControl 以显示几个不同的 UserControl 视图(子视图,每个选项卡中都有一个)。每个 View 都有一个关联的 ViewModel。
我希望绑定TabControl,这样我只需将一个新的子视图加载到ApplicationViewModel中,它就会出现在TabControl上。
我已成功将 子视图 绑定到内容,但似乎无法在标题中获取任何内容。我希望将标头绑定到 sub-view 的 ViewModel 中的属性,特别是 TabTitle。
应用程序视图(DataTemplate 绑定不起作用):
<Window ...>
<DockPanel>
<TabControl ItemsSource="{Binding PageViews}" SelectedIndex="0"> <!--Working-->
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.TabTitle}, Path=DataContext.TabTitle}" /> <!--Not Working-->
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</DockPanel>
</Window>
Application ViewModel(ObservableObject基本上实现了INotifyPropertyChanged`):
class ApplicationViewModel : ObservableObject
{
private DataManager Data;
private ObservableCollection<UserControl> _pageViews;
internal ApplicationViewModel()
{
Data = new DataManager();
PageViews.Add(new Views.MembersView(new MembersViewModel(Data.DataSet)));
}
public ObservableCollection<UserControl> PageViews
{
get
{
if (_pageViews == null)
{
_pageViews = new ObservableCollection<UserControl>();
}
return _pageViews;
}
}
MembersView 背后的代码:
public partial class MembersView : UserControl
{
public MembersView(MembersViewModel ViewModel)
{
InitializeComponent();
DataContext = ViewModel;
}
}
MembersViewModel(截断):
public class MembersViewModel : INotifyPropertyChanged
{
public TabTitle { get; protected set; }
public MembersViewModel(DataSet BBDataSet)
{
TabTitle = "Members";
}
//All view properties
}
我确定这很简单......
【问题讨论】:
-
你不应该创建
ObservableCollection<UserControl>,但ObservableCollection<MembersViewModel>和ItemTemplate/ContentTemplate应该是MembersView -
如何告诉程序需要显示一个视图?
-
如果您要绑定到
ObservableCollection<MembersViewModel>,那么每个标题和内容的DataContext将是MembersViewModel的一个实例,它会被转换为带有DataTemplate的UI 元素(ItemTemplatefor标题和ContentTemplate用于内容)所以标题中的TextBlock看起来像<TextBlock ... Text="{Binding TabTitle}"/>和ContentTemplate将是 - 我假设 -MembersView在同一显示 所有视图属性方式与标题相同。
标签: c# wpf mvvm tabcontrol