2013-08-08 2 views
0

Je veux lier mon Datatemplate à 2 sources de données, une source de données qui définira réellement ce qui est dans la ListBox et autre qui déterminera combien de ListBox sont là et quels éléments dans la Listbox sont sélectionnés \ checked.Liaison à 2 sources de données

Je suivais XAML ai

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <DataTemplate x:Key="TokenListTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox x:Name="chkToken" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"> 
       <TextBlock Text="{Binding Path=Text}" /> 
      </CheckBox> 
     </StackPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="ItemTemplate"> 
     <Border BorderThickness="1"> 
      <StackPanel Margin="3"> 
       <TextBlock Text="{Binding Path=Header}"/> 
       <ListBox ItemTemplate="{StaticResource TokenListTemplate}" 
         ItemsSource="{Binding Path=Tokens}" > 
       </ListBox> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ListBox ItemTemplate="{StaticResource ItemTemplate}" 
      ItemsSource="{Binding}"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 
</Grid> 

Et c'est le codebehind

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 

     ObservableCollection<DataEntity> _actualObjects; 

     List<Token> tokens1 = new List<Token>() 
              { 
               new Token("1"),              
               new Token("2"), 
               new Token("3"), 
               new Token("4") 
              }; 

     List<Token> tokens2 = new List<Token>() 
              { 
               new Token("11"),              
               new Token("21"), 
               new Token("31") 
              }; 

     _actualObjects = new ObservableCollection<DataEntity>() 
      { 
       new DataEntity(tokens1, "A", "1,2,3", 1), 
       new DataEntity(tokens1, "B", "2,3", 1), 
       new DataEntity(tokens2, "C", "21,31", 2) 
      }; 


     DataContext = _actualObjects; 
    } 

    class DataEntity 
    { 
     public DataEntity(List<Token> tokens, string header, string tokenString, int entityTypeId) 
     { 
      Tokens = tokens; 
      Header = header; 
      TokenString = tokenString; 
      EntityTypeId = entityTypeId; 
     } 
     public List<Token> Tokens { get; set; } 
     public String Header { get; set; } 
     public String TokenString { get; set; } 
     public int EntityTypeId { get; set; } 

    } 

    public class Token 
    { 
     public bool IsSelected { get; set; } 
     public string Text { get; set; } 
     public Token(string text) 
     { 
      this.IsSelected = false; 
      this.Text = text; 
     } 
    } 
} 

Il produit cette enter image description here

Je ne veux pas injecter token1 Liste token2 dans DataEntity objet donc en d'autres termes, je veux que le constructeur DataEntity soit

public DataEntity(string header, string tokenString, int entityTypeId) 

Listbox DataTemplate doit choisir

  • Liste tokens1 comme source de données pour ses LisBoxItems si Dataentity.EntityTypeId = 1
  • Liste tokens2 comme source de données pour son LisBoxItemsif DataEntity.EntityTypeId = 2

De même, TokenString dans DataEntity doit être lié aux éléments de la zone de liste, c'est-à-dire si Listbox affiche 1 2 3 4 et DataEntity pour cette zone de liste a sa valeur TokenString réglée sur « 1,2,3 », puis 1 2 3 doit être vérifié dans la liste enter image description here

Répondre

0

Je recommande de créer un ViewModel comme une couche entre votre modèle et la vue. Dans le ViewModel vous pouvez organiser les données pour s'adapter aux contrôles utilisés sans changer votre modèle. Ainsi, le ViewModel pourrait par exemple scinder le tokenString de DataEntity en une liste de jetons.

Juste Google pour MVVM (Model-View-ViewModel) pour des exemples et des explications supplémentaires ou regardez ici sur SO (comme MVVM: Tutorial from start to finish?).

0

Vous n'y pensez pas correctement. Vous devez créer une classe (certains peuvent appeler un modèle de vue) avec la responsabilité de fournir tous les des données dont la vue (ou l'interface utilisateur) aura besoin. Par conséquent, vous devrez avoir une propriété qui contient une collection de type DataEntity (si je vous comprends bien) pour «définir ce qui est dans le ListBox externe» comme vous le dites.

Ensuite, vous avez besoin d'un DataTemplate pour décrire ce qui doit être affiché pour chaque article dans le ListBox - votre modèle 'ItemTemplate'. Ce DataTemplate devrait avoir un autre ListBox à l'intérieur dans lequel afficher vos objets Token. Votre DataEntity devrait avoir quelque chose comme cette propriété en elle:

public List<Token> Tokens 
{ 
    get 
    { 
     if (EntityTypeId == 1) return tokens1; 
     else if (EntityTypeId == 2) return tokens2; 
    } 
} 

Vous aurez alors besoin d'une autre DataTemplate pour vos objets Token - votre modèle « TokenListTemplate », mais sans StackPanel ... la ListBox intérieure remplace que, par exemple.S'il y a deux objets Token dans un objet DataEntity, alors cet objet affichera deux Checkbox es ... vous avez correctement lié la propriété IsChecked à la propriété Token.IsSelected.

Cela peut être compliqué, mais c'est tout à fait possible. Commencez simplement avec la première couche et obtenez vos objets DataEntity affichés dans le ListBox extérieur en utilisant votre modèle 'ItemTemplate'. Une fois que ce bit est correct, passez à l'intérieur ListBox. Bonne chance.

+0

L'exposition de jetons à partir de DataEntity est ce que j'essaie d'empêcher car la liste de jetons est uniquement pour l'interface utilisateur et n'a aucune signification dans mon entité commerciale. – user2071531

+0

@ user2071531 vous pouvez mettre cette logique dans la nouvelle classe proposée par Sheridan (le viewmodel). L'idée d'un modèle de vue est de contenir des informations qui sont utilisées uniquement pour l'interface utilisateur (la vue) mais n'ont aucune signification pour les entités commerciales (le modèle). –

Questions connexes