【问题标题】:Bind to ListBox selectedItem inside TabControl绑定到 TabControl 内的 ListBox selectedItem
【发布时间】: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 绑定到Selectedconverter

标签: wpf binding listbox tabcontrol


【解决方案1】:

怎么样,我自己也很惊讶 :-)
对您的 Xaml 进行这些更改。

<TabControl ItemsSource="{Binding}" 
    Grid.Column="0" SelectedIndex="0" 
    IsSynchronizedWithCurrentItem="True">

<ListBox ItemsSource="{Binding Collection}" 
    IsSynchronizedWithCurrentItem="True">

<TextBox x:Name="DetailTextBox" 
    Text="{Binding /Collection/Detail}"/>

“/”绑定到控件的 CollectionView 的当前选定项。

所以上面的绑定是向下钻取的

  • Data Context 上设置的 ObservableCollection 的当前 SelectedItem
  • 该项目的 Collection 属性
  • Collection 属性的当前 SelectedItem (ObservableCollection)
  • 该项目的 Detail 属性。

为了使其工作,我们需要指定 IsSynchronizedWithCurrentItem="True" 以确保 SelectedItem 与每个集合的当前项保持同步。

【讨论】:

  • 太简单了,我只是删除了项目,然后它与上面的代码一起工作。
  • 谢谢,从答案中删除了“项目”。
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2011-01-02
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2011-02-01
相关资源
最近更新 更多