我有一个WPF程序,它有一个主视图(Window
),其中包含一个TabControl
,用于显示不同的UserControl
视图(子视图,每个标签页中都有一个)。 每个视图都有一个关联的ViewModel。
我希望绑定TabControl
,这样我只需要将新的子视图加载到ApplicationViewModel中,它就会出现在TabControl
上。
我已经成功地将子视图绑定到了内容,但无法在标题中得到任何东西。 我希望将标题绑定到子视图的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>
应用程序视图模型(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
。 - dkozlObservableCollection <MembersViewModel>
,那么每个标头和内容的DataContext
都将是MembersViewModel
的实例,并且它将转换为带有DataTemplate
(标头的ItemTemplate
和内容的ContentTemplate
)的UI元素,所以您在标头中的TextBlock
将如下所示:<TextBlock ... Text="{Binding TabTitle}"/>,并且ContentTemplate
-我假设-将显示MembersView
,以与标头中的相同方式显示_All视图属性_。 - dkozl