带绑定的TabItem数据模板
本文关键字:数据 TabItem 绑定 | 更新日期: 2023-09-27 18:06:19
我有一个TabControl
在我的应用程序。我想有尽可能多的TabItems
在我的字典中的条目。
这是我的字典:
public Dictionary<string , ObservableCollection<PerformanceCounter>> Counters
{
get { return _Counters; }
}
Dictionary<string, ObservableCollection<PerformanceCounter>> _Counters = new Dictionary<string , ObservableCollection<PerformanceCounter>>();
每个条目都有一个string key和一个ObservableCollection of PerformanceCounter对象。重要的是,每个PerformanceCounter对象都有属性:CounterName和InstanceName——我需要这两个属性来显示它们。
现在,到我的XAML:
<TabItem Header="Memory">
<Grid Name="RAMGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox Name="RAMListBox" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" ItemsSource="{Binding Memory, Mode=OneWay}" SelectionMode="Multiple" BorderThickness="1" BorderBrush="#FF8B8B8B" SelectionChanged="RAMListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding CounterName, Mode=OneWay}" />
<Run Text="{Binding InstanceName, Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Name="RAMSelectAllButton" Margin="0,10,0,0" Grid.Column="0" Grid.Row="1" Click="RAMSelectAllButton_Click" >
<TextBlock Text="SELECT ALL"/>
</Button>
<Button Name="RAMUnSelectAllButton" Margin="0,10,0,0" Grid.Column="1" Grid.Row="1" Click="RAMUnSelectAllButton_Click" >
<TextBlock Text="UNSELECT ALL"/>
</Button>
</Grid>
</TabItem>
这就是我所做的,正如你可能已经知道的,它不起作用。以上代码仅适用于我的字典中的一个条目,其中键为"Memory"。
在我的代码中,我设置DataContext:
this.DataContext = appData.Counters;
appData。counter就是我在开头展示的那本字典。
这是我想要实现的:无论字典中有多少条目,TabControl都会为每个条目显示TabItem。每个TabItem都有一个列表框和2个按钮。我也需要能够访问这些(为了清除列表,并有点击事件的每个按钮)。
我真的不知道该怎么做,希望你能帮助我。
Binding TabControl to item in Dictionary:
<Window.Resources>
<DataTemplate x:Key="templateForTheContent" >
<StackPanel>
<ListBox Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0"
ItemsSource="{Binding Value, Mode=OneWay}"
SelectionMode="Multiple"
BorderThickness="1" BorderBrush="#FF8B8B8B">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding CounterName, Mode=OneWay}" />
<Run Text="{Binding InstanceName, Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="templateForTheHeader" >
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<TabControl TabStripPlacement="Left" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Counters}"
ContentTemplate="{StaticResource templateForTheContent}"
ItemTemplate="{StaticResource templateForTheHeader}">
</TabControl>
</Grid>
现在,字典是不可观察的,所以如果项目将在运行时添加/删除,你可以考虑使用类似ObservableDictionary的东西来代替
创建包含以下内容的ViewModel-class:
- 你的字典
- 按钮的两个iccommand实现
- 设置ViewModel-class为TabControl的DataContext
- 设置Counters作为TabControl的ItemSource
- 重用TabItem中定义的xml代码,并将其用作Tabcontrol。 ContentTemplate
- 与。使用RelativeSource 将您的按钮命令转换为ViewModel中的iccommands
参见示例:
- ContentTemplate: https://wpf.2000things.com/tag/tabcontrol/
- ICommand https://stackoverflow.com/a/1468830/4919708
- RelativeSource: https://stackoverflow.com/a/84317/4919708
正如我在上面的一个评论中所说,我把我的字典改成了这样:
//list of all counters
public ObservableCollection<ObservableCollection<PerformanceCounter>> Counters
{
get { return _Counters; }
}
ObservableCollection<ObservableCollection<PerformanceCounter>> _Counters = new ObservableCollection<ObservableCollection<PerformanceCounter>>();
我使用了@Arie的解决方案来编写这个XAML:
<DataTemplate x:Key="templateForTheContent" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0"
ItemsSource="{Binding}"
SelectionMode="Multiple"
BorderThickness="1" BorderBrush="#FF8B8B8B">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding CounterName, Mode=OneWay}" />
<Run Text="{Binding InstanceName, Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Name="RAMSelectAllButton" Margin="0,10,0,0" Grid.Column="0" Grid.Row="1" >
<TextBlock Text="SELECT ALL"/>
</Button>
<Button Name="RAMUnSelectAllButton" Margin="0,10,0,0" Grid.Column="1" Grid.Row="1" >
<TextBlock Text="UNSELECT ALL"/>
</Button>
</Grid>
</DataTemplate>
<DataTemplate x:Key="templateForTheHeader" >
<TextBlock Text="{Binding CategoryName}"/>
</DataTemplate>
</Window.Resources>
当我在后面的代码中向我的类ObservableCollection中添加条目时,它会正确显示多少个制表符。
现在我有一个新问题:我不知道如何从每个选项卡访问每个列表框。我需要能够读取选定对象的列表