【发布时间】:2012-03-19 20:44:08
【问题描述】:
好的,我得到了这个包含 ListBox 的 Tabcontrol。现在我的问题是我想将 <TextBox x:Name="DetailTextBox" Text="{Binding Detail}"/> 绑定到列表框中的 selectedItem 并显示 Detail 属性值。
请注意,TextBox 不是 TabControl 的一部分,而是在另一个 Column 中。
我不太明白如何处理绑定,当有多个 ListBox 时,每个 TabControl 项中有一个。
我的课
public class TabViewModel
{
public string Name { get; set; }
public ObservableCollection<TabItemViewModel> Collection { get; set; }
}
public class TabItemViewModel
{
public string Title { get; set; }
public string Detail { get; set; }
}
公共主窗口()
var tabViewModels = new ObservableCollection<TabViewModel>();
tabViewModels.Add(new TabViewModel{Name = "Tab 1", Collection = new ObservableCollection<TabItemViewModel>{new TabItemViewModel{Detail = "Detail 1.1", Title = "Title 1.1"}, new TabItemViewModel{Detail = "Detail 2.2", Title = "Title 2.2"}}});
tabViewModels.Add(new TabViewModel { Name = "Tab 2", Collection = new ObservableCollection<TabItemViewModel> { new TabItemViewModel { Detail = "Detail 2.1", Title = "Title 2.1" }, new TabItemViewModel { Detail = "Detail 2.2", Title = "Title 2.2" } } });
tabViewModels.Add(new TabViewModel { Name = "Tab 3", Collection = new ObservableCollection<TabItemViewModel> { new TabItemViewModel { Detail = "Detail 3.1", Title = "Title 3.1" }, new TabItemViewModel { Detail = "Detail 3.2", Title = "Title 3.2" } } });
DataContext = tabViewModels;
MainWindow.xaml。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<TabControl ItemsSource="{Binding}" Grid.Column="0" SelectedIndex="0">
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header">
<Setter.Value>
<Binding Path="Name"/>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ContentTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding Collection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
<StackPanel Grid.Column="1">
<TextBox x:Name="DetailTextBox" Text="{Binding Detail}"/>
</StackPanel>
</Grid>
编辑
临时解决方案 找到了一种使其工作的方法,但我仍在寻找纯 Xaml 解决方案。 添加了一个 SelectionChange 事件
<ListBox ItemsSource="{Binding Collection}" SelectionChanged="ListBox_SelectionChanged">
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
DetailTextBox.DataContext = (TabItemViewModel) e.AddedItems[0];
}
【问题讨论】:
-
使用转换器或将您的视图选择同步到您的视图模型
-
你能告诉我一些关于这样做的信息吗?
-
两者 :-) 我从未使用过转换器,也不确定同步解决方案是什么。
-
同步:在你的视图模型中;添加与您的收藏相同的另一个属性;所以在
TabViewModel中添加TabItemViewModel Selected。然后在您的视图中,将ListBox SelectedItem绑定到Selected。 converter
标签: wpf binding listbox tabcontrol