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
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
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
@ 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). –