Bonjour,
Sous ce titre quelque peu racoleur, j'ai 2 questions simples.
Est il "conforme" d'avoir 1 seule vue pour plusieurs ViewModel et comment transmettre à cette vue les bonnes données selon le ViewModel utilisé?
Car voici mon dilemme.
Je dois afficher des coordonnées de nos clients (nom, prénom, adresse etc...) pour :
-celui que l'on livre
-celui qui nous paye
Les champs à afficher sont identiques pour les 2, seules les données peuvent peuvent être différentes.
Dans mon esprit, une unique vue est donc nécessaire.
Je parviens parfaitement à afficher ma vue pour plusieurs ViewModel, mais je ne sais pas binder les données...
Voici ce que j'ai fait (en simplifiant, j'espère que ça restera compréhensible).
J'ai crée une fenêtre principale qui affichera 2 boutons (sous forme de listbox dynamique), "livré à" et "payeur" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 <UserControl x:Class="Discovery.View.BaseInfoView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ViewModel="clr-namespace:ViewModel" xmlns:View="clr-namespace:Discovery.View"> <UserControl.Resources> <DataTemplate DataType="{x:Type ViewModel:ShipToViewModel}"> <View:CustomerInfoView /> </DataTemplate> <DataTemplate DataType="{x:Type ViewModel:SoldToViewModel}"> <View:CustomerInfoView /> </DataTemplate> </UserControl.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition /> </Grid.RowDefinitions> <ListBox Grid.Row="0" Name="LstCustomerInfo" ItemsSource="{Binding SubMenus}" SelectedIndex="0"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" Padding="10" VerticalAlignment="Center"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <GroupBox Grid.Row="1"> <ContentControl Content="{Binding ElementName=LstCustomerInfo, Path=SelectedItem}"/> </GroupBox> </Grid> </UserControl>
Fenêtre contrôlée par un ViewModel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 namespace ViewModel { class BaseInfoViewModel : BaseViewModel { public override string Name { get { return "Info de base"; } } private readonly ObservableCollection<BaseViewModel> _submenus; public ObservableCollection<BaseViewModel> SubMenus { get { return this._submenus; } } public BaseInfoViewModel() { this._submenus = new ObservableCollection<BaseViewModel>(); this._submenus.Add(new ShipToViewModel()); this._submenus.Add(new SoldToViewModel()); } } }
Les 2 ViewModel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace ViewModel { public class ShipToViewModel : BaseViewModel { public override string Name { get { return "Livré à "; } } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace ViewModel { class SoldToViewModel : BaseViewModel { public override string Name { get { return "Payeur"; } } } }
Et un UserControl devant afficher toutes les coordonnées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <UserControl x:Class="Discovery.View.CustomerInfoView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <TextBlock Text="Nom : " /> <TextBlock Text="{Binding Name1, Mode=OneWay}" /> </Grid> </UserControl>
Les Model utilisés sont ceux ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace Model { public class DiscoveryModel { public string ID { get; set; } public string Qualification { get; set; } public CustomerInfo ShipTo { get; set; } public CustomerInfo Soldto { get; set; } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace Model { public class CustomerInfo { public string Name1 { get; set; } public AddressModel Address { get; set; } public string Email { get; set; } public string Phone { get; set; } } }
Maintenant je suis coincé, je ne sais pas comment indiquer à ma vue qu'un coup il faut prendre le "livré à" et l'autre le "payeur". Il doit falloir changer le DataContext selon le ViewModel utilisé, mais je ne sais pas comment faire.
Je m'en remet donc à votre science
Merci.
Partager