tabcontrol - WPF TabControl模板模板

  显示原文与译文双语对照的内容
123 4

我是一个新的WPF用户,我正在尝试围绕模板进行 templating 。我特别想给TabControl模板。

我感到困惑的是,TabControl绑定到数据时实际生成的控件。我需要每个选项卡都有一个单独的控件,其中包含内容部分中的控件。我发现,一组控件被创建,当用户从tab到tab时,只有绑定的数据更改。

项目描述:

示例项目由一个带有TabControl的单个视图组成。在TabControl的内容模板中有一个列表框。视图被绑定到TabBindingViewModel类的一个对象。此类有一个名为选项卡的属性,它是TabViewModel对象的集合。TabViewModel类具有两个属性:TabHeader和 guid 。TabViewModel.TabHeader 是包含将出现在选项卡上的文本的字符串,TabViewModel.Guids 是字符串的集合。

绑定时,TabBindingViewModel.Tabs 集合中的每个TabViewModel都应该在TabControl对象中生成一个选项卡,该选项卡的标题为 TabViewModel.TabHeader 属性。每个选项卡的内容应该是使用 TabViewModel.Guids 集合中的字符串集合填充的列表框。

问题

这看起来很好,但是如果更改 ListBox ( 例如滚动或者选择项目)的状态,然后更改选项卡上的列表框,看上去是。这使我假设只有一个列表框( 而不是 5个独立实例)的实例,当你更改选项卡时,数据是唯一更改的。

在另一个场景中,不是将集合绑定到模板,而是在xaml中使用它自己的ListBox显式定义每个。此时,当我单击 tab tab选项卡时,每个列表框都保持自己的状态。

我的假设正确?如果是这样,我如何实现第二个场景中描述的结果,而仍然利用模板。( 这是一个简化的例子。我的真实世界内容要复杂得多。

感谢你的帮助 !

下面列出了我的示例的源代码。

视图类

<Window x:Class="TabBindingQuestion.View.TabBinding"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:vm="clr-namespace:TabBindingQuestion.ViewModel"
 Title="TabTemplateView" 
 Height="344" Width="618">
 <Window.Resources>
 <vm:TabBindingViewModel x:Key="Data"/>
 </Window.Resources>
 <Grid DataContext="{StaticResource Data}">
 <TabControl Width="Auto"
 Height="Auto"
 ItemsSource="{Binding Tabs}"
 IsSynchronizedWithCurrentItem="True">
 <TabControl.ItemContainerStyle>
 <Style TargetType="TabItem">
 <Setter Property="Header" Value="{Binding TabHeader}"/>
 <Setter Property="ContentTemplate">
 <Setter.Value>
 <DataTemplate>
 <ListBox Width="Auto"
 Height="Auto"
 ItemsSource="{Binding Guids}"/>
 </DataTemplate>
 </Setter.Value>
 </Setter>
 </Style>
 </TabControl.ItemContainerStyle>
 </TabControl>
 </Grid>
</Window>

using System.ComponentModel;
namespace TabBindingQuestion.ViewModel
{
 class ViewModelBase : INotifyPropertyChanged
 {
 public event PropertyChangedEventHandler PropertyChanged;
 protected void OnPropertyChanged(object sender, string propertyName)
 {
 if (this.PropertyChanged!= null)
 {
 PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
 }
 }
 }
}

using System.Collections.ObjectModel;
namespace TabBindingQuestion.ViewModel
{
 class TabBindingViewModel : ViewModelBase
 {
 #region Members
 private ObservableCollection<TabViewModel> _Tabs;
 public ObservableCollection<TabViewModel> Tabs
 {
 get { return _Tabs; }
 set
 {
 _Tabs = value;
 OnPropertyChanged(this,"Tabs");
 }
 }
 #endregion
 #region Constructor
 public TabBindingViewModel()
 {
 var tabs = new ObservableCollection<TabViewModel>();
 for (int i = 1; i <= 5; i++)
 {
 tabs.Add(new TabViewModel() { TabHeader ="Tab" + i.ToString() });
 }
 Tabs = tabs;
 }
 #endregion
 }
}

using System;
using System.Collections.ObjectModel;
namespace TabBindingQuestion.ViewModel
{
 class TabViewModel : ViewModelBase
 {
 #region Members
 private string _TabHeader;
 public string TabHeader
 {
 get { return _TabHeader; }
 set
 {
 _TabHeader = value;
 OnPropertyChanged(this,"TabHeader");
 }
 }
 private ObservableCollection<string> _Guids;
 public ObservableCollection<string> Guids
 {
 get { return _Guids; }
 set
 {
 _Guids = value;
 OnPropertyChanged(this,"Guids");
 }
 }
 #endregion
 #region Constructors
 public TabViewModel()
 {
 var guids = new ObservableCollection<string>();
 for (int i = 1; i <100; i++)
 {
 guids.Add(Guid.NewGuid().ToString());
 }
 Guids = guids;
 }
 #endregion
 }
}
时间:原作者:0个回答

146 5

是TabControl在切换选项卡时使用控件,如果它们是相同的。它还根据需要卸载/重新加载控件,从而导致未绑定控件被重置。例如如果Tab1具有选定的列表框,并且在选择了 Tab1 and选项tabs选择和 switch 选项卡,则再次选中 Tab1 Tab1 ItemA 。

最好做的事情是将你的UI属性绑定到后面代码中的。例如TabControl可能包含TabItemViewModel列表,每个ViewModel应该包含表示UI状态的属性,例如 ListBox.SelectedItems 或者 CheckBox.IsChecked 。

原作者:
...