2010-09-14 56 views
0

所以情况是这样的:WPF多选列表框和复合项目源绑定

我有一个集合的集合!

我有2个列表框!

列表框A包含我的收藏集,因为它是的ItemSource并支持多种选择(的SelectionMode =扩展)

列表框B需要得到它的ItemSource从所有集合的列表框A.选择的是复合

是有一个很好的方法来做到这一点?

数据结构如下

TestContainers []。TestEntries []

如果测试容器中的& C被选择,则列表框B包含所有在两个容器中的& C中的TestEntries的

我希望这是明确的?

回答

1

链接两个列表框之间的数据使用以下XAML引用从一个列表框中选择的项目到其他listobx:

注:我绑定到使用一个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> 

这里是包括代码以初始化集合视图模型:

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; 
    } 
    } 
} 

这里是TestContainer:

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; 
    } 
    } 
} 

这里是的TestEntry:

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

这里查看更多e我初始化ViewModel:

public partial class MainView : Window 
{ 
    public MainView() 
    { 
    InitializeComponent(); 

    this.DataContext = new ViewModels.MainViewModel(); 
    } 
}