combobox - 使用组合框控制TabControl活动选项卡的wpf

  显示原文与译文双语对照的内容
65 3

我真正尝试实现的是使用组合框作为导航控件来完全控制活动 TabItem 。

以下是我目前所得到的内容:

 <TabControl Canvas.Left="26" Canvas.Top="27" Height="100" Name="TabControl1" Width="220">
 <TabItem Header="TabItem1" x:Name="TabItem1">
 <Grid/>
 </TabItem>
 <TabItem Header="TabItem2" x:Name="TabItem2">
 <Grid/>
 </TabItem>
 </TabControl>
 <ComboBox Canvas.Left="126" Canvas.Top="134" Height="23" Name="CmbTabs" Width="120" 
 ItemsSource="{Binding ElementName=TabControl1, Path=Items}" 
 SelectedValue="{Binding ElementName=TabControl1, Path=SelectedIndex}" 
 SelectedValuePath="TabIndex"
 DisplayMemberPath="Header"/>

实际工作的唯一内容是当我按下组合框按钮时显示的列表。即使通过列表选择一个nmake名也不会做任何事情,它甚至不会更新组合框的选定值文本框。

任何帮助?

编辑:Steve Robbins的回答对于"控制"问题的回答很好。

如何在组合框下拉列表中选择项不更新组合框的值?( comboboxes文本框仍然为空) !

时间:原作者:0个回答

110 5

如果你试图控制组合的TabControl,那么它看起来有点落后。如果更改选项卡控件上的SelectedIndex以将它的绑定到组合,则应执行以下操作:

<TabControl Canvas.Left="26" Canvas.Top="27" Height="100" Name="TabControl1" Width="220" SelectedIndex="{Binding ElementName=CmbTabs, Path=SelectedIndex}">
 <TabItem Header="TabItem1" x:Name="TabItem1">
 <Grid/>
 </TabItem>
 <TabItem Header="TabItem2" x:Name="TabItem2">
 <Grid/>
 </TabItem>
 </TabControl>
原作者:
83 3

我一直在玩这个。组合框的数据绑定的来源在做出选择后发生了变化。或者什么。

我添加了诊断命名空间:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase"

我把你的<Grid/> 改成了大铃声,这样我就能看到事情真正变化了:

 <TabItem Header="TabItem1" x:Name="TabItem1">
 <TextBlock Name="tb1" FontSize="24" Text="1" Width="100" Height="26"/>
 </TabItem>

运行这个程序时我发现诊断报告有一个奇怪的结果:

System.Windows.Data 错误:39: BindingExpression路径错误:'头'属性在上未找到'对象'''textblock'( name='tb1')"。bindingexpression: path=header,dataitem='textblock'( name='tb2') ;目标元素为'textblock'( name='') ;目标属性为'文本'( 类型'字符串')

我试图在启动时在代码中设置数据绑定一次:

 public Window1()
 {
 InitializeComponent();
 Binding positionBinding = new Binding("Items");
 positionBinding.ElementName ="TabControl1";
 positionBinding.Path = new PropertyPath("Items");
 positionBinding.Mode = BindingMode.OneTime;
 CmbTabs.SetBinding(ComboBox.ItemsSourceProperty, positionBinding);
 CmbTabs.DisplayMemberPath ="Header";
 }

在选择和更改TabItem后,它仍然切换CombobBox以显示未选中项。就像在TabControl更改后将DataContext切换到 TabControl.TabItem.TextBlock 一样。

所以我没有对你的答案,但是我有一些结果可以以让你工作。

Bea Stollnitz有一个关于使用这种诊断技术的好文章。"如何调试WPF绑定"

原作者:
102 0

我发现了这个帖子,我在MSDN上找到了这篇文章,它描述了你的问题作为一个。可以使用这里 XAML ( 它与你的XAML有相反的问题) 对它的进行复制:

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <TabControl Name="TabControl1" Width="220" Height="100" Canvas.Left="26" Canvas.Top="27">
 <TabItem x:Name="TabItem1" Header="TabItem1">
 foobar
 </TabItem>
 <TabItem x:Name="TabItem2" Header="TabItem2">
 fizzbuzz
 </TabItem>
 </TabControl>
 <ComboBox Name="CmbTabs" Width="120" Height="23" Canvas.Left="126" Canvas.Top="134"
 ItemsSource="{Binding ElementName=TabControl1, Path=Items}"
 DisplayMemberPath="Length"
 SelectedIndex="{Binding ElementName=TabControl1, Path=SelectedIndex}"/>
</Canvas>

你可以以看到除了在下拉列表中的长度绑定,它在下面的位置,而不是在内部。

我不太确定你的目的是否理想,但是你可以以通过一些优雅的方法在ComboBoxItems中再现你的头:

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <TabControl Name="TabControl1" Width="220" Height="100" Canvas.Left="26" Canvas.Top="27">
 <TabItem x:Name="TabItem1" Header="TabItem1">
 <Grid/>
 </TabItem>
 <TabItem x:Name="TabItem2" Header="TabItem2">
 <Grid/>
 </TabItem>
 </TabControl>
 <ComboBox Name="CmbTabs" Width="120" Height="23" Canvas.Left="126" Canvas.Top="134"
 SelectedIndex="{Binding ElementName=TabControl1, Path=SelectedIndex}">
 <ComboBoxItem>TabItem1</ComboBoxItem>
 <ComboBoxItem>TabItem2</ComboBoxItem>
 </ComboBox>
</Canvas>
原作者:
...