2010-09-14 9 views
0

Donc la situation est la suivante:WPF Multi-sélection ListBox et les éléments composites Liaison de la source

J'ai une collection de collections!

J'ai 2 zones de liste!

ListBox A contient ma collection de collections comme ItemSource est et prend en charge la sélection multiple (SelectionMode = Extended)

ListBox B doit obtenir ItemSource est d'un composite de toutes les collections sélectionnées dans ListBox A.

Est il y a un bon moyen de le faire?

structure de données

est la suivante

TestContainers []. TestEntries []

si le test Container A & C sont choisis puis listbox B contient tous les TestEntries dans les deux conteneurs A & C

J'espère que c'est clair?

Répondre

1

Pour lier les données entre les deux listboxes font référence aux éléments sélectionnés dans une zone de liste à l'autre listobx en utilisant le code XAML suivant:

Note: Je suis liaison à un ObservableCollection en utilisant un ViewModel; J'ai inclus la plupart de mon code ci-dessous pour permettre la reconstruction de ce code si nécessaire.

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

Voici le ViewModel qui inclut le code pour initialiser les collections:

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

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

Voici TestEntry:

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

ici la vue où e J'initialise le ViewModel:

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

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