【问题标题】:WPF Multi-selection ListBox and composite Items Source BindingWPF 多选 ListBox 和复合项目源绑定
【发布时间】:2010-09-14 23:44:57
【问题描述】:

所以情况是这样的:

我有一个收藏集!

我有 2 个列表框!

ListBox A 包含我的集合集合,因为它是 itemsource 并支持多选(SelectionMode = Extended)

ListBox B 需要从 ListBox A 中选择的所有集合的组合中获取它的 itemsource。

有什么好办法吗?

数据结构如下

TestContainers[].TestEntries[]

如果选择了测试容器 A 和 C,则列表框 B 包含容器 A 和 C 中的所有测试条目

我希望这很清楚?

【问题讨论】:

    标签: wpf data-binding listbox


    【解决方案1】:

    要链接两个列表框之间的数据,请使用以下 XAML 将一个列表框中的选定项目引用到另一个列表框:

    注意:我使用 ViewModel 绑定到 ObservableCollection;我在下面包含了我的大部分代码,以便在需要时重新构建此代码。

    <Window x:Class="TwoListBoxesSameData.Views.MainView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Main Window" Height="400" Width="800">
      <Window.Resources>
        <DataTemplate x:Key="ListBoxTemplate">
            <TextBlock>
               <TextBlock Text="{Binding Path=ContainerName}" />
            </TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="ListBoxTemplate2" >
            <TextBlock>
               <TextBlock Text="{Binding Path=TestEntries[0].EntryName}" />
            </TextBlock>
        </DataTemplate>
      </Window.Resources>
      <DockPanel>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <ListBox Grid.Row="0" 
                     x:Name="lb"
                     ItemsSource="{Binding Path=TestContainers}"
                     ItemTemplate="{Binding Source={StaticResource ListBoxTemplate}}"
                     SelectionMode="Extended">
            </ListBox>
            <ListBox Grid.Row="1" 
                     ItemsSource="{Binding ElementName=lb, Path=SelectedItems}"
                     ItemTemplate="{Binding Source={StaticResource ListBoxTemplate2}}" >
            </ListBox>
        </Grid>
      </DockPanel>
    </Window>
    

    这是包含初始化集合的代码的 ViewModel:

    public class MainViewModel : ViewModelBase
    {
      public MainViewModel()
      {
         {
            TestContainer tc1 = new TestContainer();
            tc1.ContainerName = "Container 1";
    
            TestEntry te1 = new TestEntry();
            te1.EntryName = "Search for Names";
            tc1.TestEntries.Add(te1);
    
            TestEntry te2 = new TestEntry();
            te2.EntryName = "Search for People";
    
            tc1.TestEntries.Add(te2);
            TestEntry te3 = new TestEntry();
            te3.EntryName = "Search for Things";
            tc1.TestEntries.Add(te3);
    
            _testContainers.Add(tc1);
         }
         {
            TestContainer tc2 = new TestContainer();
            tc2.ContainerName = "Container 2";
    
            TestEntry te1 = new TestEntry();
            te1.EntryName = "Look for Names";
            tc2.TestEntries.Add(te1);
    
            TestEntry te2 = new TestEntry();
            te2.EntryName = "Look for People";
            tc2.TestEntries.Add(te2);
    
            TestEntry te3 = new TestEntry();
            te3.EntryName = "Look for Things";
            tc2.TestEntries.Add(te3);
    
            _testContainers.Add(tc2);
         }
         {
            TestContainer tc3 = new TestContainer();
            tc3.ContainerName = "Container 3";
    
            TestEntry te1 = new TestEntry();
            te1.EntryName = "Find Names";
            tc3.TestEntries.Add(te1);
    
            TestEntry te2 = new TestEntry();
            te2.EntryName = "Find People";
            tc3.TestEntries.Add(te2);
    
            TestEntry te3 = new TestEntry();
            te3.EntryName = "Fine Things";
            tc3.TestEntries.Add(te3);
    
            _testContainers.Add(tc3);
         }
      }
    
      private ObservableCollection<TestContainer> _testContainers = new ObservableCollection<TestContainer>();
      public ObservableCollection<TestContainer> TestContainers
      {
         get
         {
            return _testContainers;
         }
         set
         {
            _testContainers = value;
         }
      }
    }
    

    这里是测试容器:

    public class TestContainer
    {
      public string ContainerName { get; set; }
    
      private ObservableCollection<TestEntry> _testEntries = new ObservableCollection<TestEntry>();
      public ObservableCollection<TestEntry> TestEntries
      {
         get
         {
            return _testEntries;
         }
         set
         {
            _testEntries = value;
         }
      }
    }
    

    这里是测试条目:

    public class TestEntry
    {
       public string EntryName { get; set; }
    }
    

    这里是我初始化 ViewModel 的视图:

    public partial class MainView : Window
    {
      public MainView()
      {
         InitializeComponent();
    
         this.DataContext = new ViewModels.MainViewModel();
      }
    }
    

    【讨论】:

      【解决方案2】:

      CompositeCollection 类怎么样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2021-09-21
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多