none
WPF combobox grid et Binding RRS feed

  • Question

  • Bonjour,

    Je suis bloqué dans le développement de mon application.

    J'ai une View avec son ViewModel (CommandeFournisseurViewModel).

    Ce ViewModel est composé d'une ObservableCollection<ViewModel>(CommandeFournisseurLigneViewModel) qui remplit un Grid.

    Mon problème est que chaque ViewModel de cette collection contient une collection d'un autre type (Affaire) afin de lier ma ligne commande à un numéro d'affaire.

    J'aimerais rajouter une combobox dans mon grid afin que celle-ci contienne la liste des numéro d'affaire et soit bindé avec IDAffaire de ma ligne commande.

    Mon problème se situe donc sur ma combobox dans ma view.

    Je ne sais pas comment procéder pour la charger ainsi que pourvoir effectuer la liaison avec ma ligne commande pour changer le numéro via cette combobox.

    Voici mon code :

    CommandeFournisseurViewModel

            public CommandeFournisseurViewModel(CommandeFournisseur CommandeFournisseur)
                : base(CommandeFournisseur)
            {
                Titre = "CommandeFournisseur";
    
            }
    
            public CommandeFournisseur CommandeFournisseur
            {
                get { return ObjectEntity as CommandeFournisseur; }
            }
    
    
    
            private static ObservableCollection<Devise> _ListeDevise = null;
            public ObservableCollection<Devise> ListeDevise
            {
                get
                {
    
                    if (_ListeDevise == null)
                    {
                        _ListeDevise = new ObservableCollection<Devise>(DataAccess.EntitiesContext.Context.Devises);
    
                    }
    
                    return _ListeDevise;
                }
            }
    
    
            private static ObservableCollection<Fournisseur> _ListeFournisseur = null;
            public ObservableCollection<Fournisseur> ListeFournisseur
            {
                get
                {
    
                    if (_ListeFournisseur == null)
                    {
                        _ListeFournisseur = new ObservableCollection<Fournisseur>(DataAccess.EntitiesContext.Context.Fournisseurs.OrderBy(F => F.Nom));
    
                    }
    
                    return _ListeFournisseur;
                }
            }
    
    
    
            private ObservableCollection<CommandeFournisseurLigneViewModel> _other = null;
            public ObservableCollection<CommandeFournisseurLigneViewModel> other
            {
                get
                {
                    if (_other == null)
                    {
                        _other = new ObservableCollection<CommandeFournisseurLigneViewModel>(
    
                            (from CFL in DataAccess.EntitiesContext.Context.CommandeFournisseurLignes
                             from P in DataAccess.EntitiesContext.Context.Personnes
                             where CFL.CommandeFournisseur.IDPersonneDemandeur == P.ID
                             && CFL.CommandeFournisseur.ID == this.CommandeFournisseur.ID
                             && P.IDAffectationSociete == DataAccess.EntitiesContext.Context.IDAffectationSocieteCourant
                             && (CFL.CommandeFournisseur.DateCommande > DateTimeOutil.PremierJanvier)
                             select CFL).ToList().Select(CFL => new CommandeFournisseurLigneViewModel(CFL)));
    
    
                    }
    
                    return _other;
    
                }
                set { _other = value; }
            }
    
    
            private ObservableCollection<Affaire> _ListeAffaire = null;
            public ObservableCollection<Affaire> ListeAffaire
            {
                get
                {
                    if (_ListeAffaire == null)
                    {
                        _ListeAffaire = new ObservableCollection<Affaire>(DataAccess.EntitiesContext.Context.Affaires.OrderBy(A => A.Numero));
                    }
                    return _ListeAffaire;
                }
            }
    
    
    
    
            private void ExecuteSupprimerLigne(CommandeFournisseurLigneViewModel Parametre)
            {
                DataAccess.EntitiesContext.Context.DeleteObject(Parametre.CommandeFournisseurLigne);
                this.other.Remove(Parametre);
            }
            private ICommand _DeleteLine = null;
            public ICommand DeleteLine
            {
                get
                {
                    if (_DeleteLine == null)
                        _DeleteLine = new DelegateCommand<CommandeFournisseurLigneViewModel>((CommandeFournisseurLigneViewModel Parametre) => ExecuteSupprimerLigne(Parametre));
    
                    return _DeleteLine;
                }
            }
    
    
    
            private ICommand _AddLine = null;
            public ICommand AddLine
            {
                get
                {
                    if (_AddLine == null)
                        _AddLine = new DelegateCommand(() => ExecuteAddLigne());
    
    
                    return _AddLine;
                }
            }
            private void ExecuteAddLigne()
            {
                CommandeFournisseurLigne line = new CommandeFournisseurLigne();
                line.IDCommandeFournisseur = this.CommandeFournisseur.ID;
                line.IDAffaire = 120;
    
                CommandeFournisseurLigneViewModel tmp = new CommandeFournisseurLigneViewModel(line);
                DataAccess.EntitiesContext.Context.AddToCommandeFournisseurLignes(line);
                this.other.Add(tmp);
            }

    La View qui va avec

    <ig:XamGrid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" x:Name="dataGridTest" ItemsSource="{Binding other}" AutoGenerateColumns="false"> <ig:XamGrid.Columns>   <ig:TemplateColumn Key="CommandeFournisseurLigne" HeaderText="test" HorizontalContentAlignment="Center">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <ComboBox DisplayMemberPath="Numero" IsEnabled="True"

                              ItemsSource="{Binding Path=DataContext.ListeAffaire,
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ig:XamGrid}}}" />

                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                    </ig:TemplateColumn>

    <ig:TextColumn Key="CommandeFournisseurLigne.Affaire.Numero" IsReadOnly="True"/> <ig:TextColumn Key="CommandeFournisseurLigne.IDAffaire"/> <ig:TextColumn Key="CommandeFournisseurLigne.Description"/> <ig:TextColumn Key="CommandeFournisseurLigne.PrixUnitaire"/> <ig:TextColumn Key="CommandeFournisseurLigne.Quantite"/> <ig:TextColumn Key="CommandeFournisseurLigne.Total_HT"/> <ig:TemplateColumn Key="CommandeFournisseurLigne.ID" HeaderText="Supprimer" HorizontalContentAlignment="Center"> <ig:TemplateColumn.ItemTemplate> <DataTemplate> <Button Height="15" Style="{StaticResource RemoveButtonStyle}" CommandParameter="{Binding}" Command="{Binding DataContext.DeleteLine, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ig:XamGrid}}}"/> </DataTemplate> </ig:TemplateColumn.ItemTemplate> </ig:TemplateColumn> </ig:XamGrid.Columns> <ig:XamGrid.AddNewRowSettings> <ig:AddNewRowSettings AllowAddNewRow="Bottom" IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="False" IsMouseActionEditingEnabled="DoubleClick" IsOnCellActiveEditingEnabled="True"/> </ig:XamGrid.AddNewRowSettings> <ig:XamGrid.EditingSettings> <ig:EditingSettings AllowEditing="Row" IsMouseActionEditingEnabled="DoubleClick" IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" IsOnCellActiveEditingEnabled="False" /> </ig:XamGrid.EditingSettings> <ig:XamGrid.SelectionSettings> <ig:SelectionSettings CellClickAction="SelectRow" CellSelection="Single" RowSelection="Single"></ig:SelectionSettings> </ig:XamGrid.SelectionSettings> <ig:XamGrid.RowSelectorSettings> <ig:RowSelectorSettings Visibility="Hidden"/> </ig:XamGrid.RowSelectorSettings> </ig:XamGrid>


    Et le ViewModel qui sert d'Observable collection:

        public class CommandeFournisseurLigneViewModel : BaseViewModel<CommandeFournisseurLigne>
        {
            public CommandeFournisseurLigneViewModel(CommandeFournisseurLigne CommandeFournisseurLigne)
                : base(CommandeFournisseurLigne)
            {
                Titre = "CommandeFournisseurLigne";
            }
    
    
    
            public CommandeFournisseurLigneViewModel()
                : base(new CommandeFournisseurLigne())
            {
                    Titre = "CommandeFournisseurLigne";
            }
    
    
    
            public CommandeFournisseurLigne CommandeFournisseurLigne
            {
                get { return ObjectEntity as CommandeFournisseurLigne; }
            }
    
    
            public CommandeFournisseur CommandeFournisseur
            {
                get { return CommandeFournisseurLigne.CommandeFournisseur as CommandeFournisseur; }
            }
    
    
     
            #region Command
            private ICommand _AfficherDetailCommand = null;
            public ICommand AfficherDetailCommand
            {
                get
                {
                    if (_AfficherDetailCommand == null)
                        _AfficherDetailCommand = new Framework.Windows.DelegateCommand(() => ExecuteAfficherDetail());
    
                    return _AfficherDetailCommand;
                }
            }
            private void ExecuteAfficherDetail()
            {
    
                if (this.Template == null)
                {
                    this.Template = Global.GetDataTemplateFromRessource("CommandeFournisseurDataTemplate");
                    //(WpfERP.Outils.StyleController.FindResource("CommandeFournisseurDataTemplate") as DataTemplate);
                }
    
                Global.AfficherPopUP(new CommandeFournisseurViewModel(this.CommandeFournisseur), true);
            }
           






    • Modifié Lionhart34 mardi 8 juillet 2014 07:18
    • Déplacé Aurel Bera lundi 14 juillet 2014 07:03 WPF
    lundi 7 juillet 2014 12:53

Toutes les réponses

  • Bonjour,

    J'ai une View avec son ViewModel; ce ViewModel est composé d'une ObservableCollection<ViewModel> qui remplie un Grid.Mon problème est que chaque ViewModel de cette combobox contient une liste que j'aimerai exposer dans la grid via une combobox.
    Pouvez-vous vous relire ? Je ne comprends pas ce que vous recherchez à faire exactement...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 7 juillet 2014 21:14
    Modérateur
  • Effectivement, j'ai une ligne qui a sauté.

    Merci de me l'avoir signalé. J'ai modifié mon texte afin que celui-ci soit compréhensible.

    Merci

    Edit :

    J'ai finit par réussir à afficher ma liste mais je n'ai pas réussi à binder sur l'IDAffaire de la ligne... Je n'arrive donc pas à ma clé étrangère...

    Sa donne ceci :

       <ig:TemplateColumn Key="CommandeFournisseurLigne" HeaderText="test" HorizontalContentAlignment="Center" IsReadOnly="True">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Source={x:Static ViewModel:CommandeFournisseurViewModel.ListeAffaire}}"
                                          DisplayMemberPath="Numero"
                                          SelectedValuePath="ID"
                                          />                         
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                    </ig:TemplateColumn>


    EDIT :

    J'ai fini par passer ma liste d'affaire en static dans mon ViewModel pour faire ceci :

      <ig:TemplateColumn Key="CommandeFournisseurLigne" HeaderText="Numéro d'affaire">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding CommandeFournisseurLigne.Affaire.Numero, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                        <ig:TemplateColumn.EditorTemplate>
                            <DataTemplate>
                                <ComboBox Width="50" ItemsSource="{Binding Source={x:Static ViewModel:CommandeFournisseurViewModel.ListeAffaire}}"
                                          SelectedValue="{Binding CommandeFournisseurLigne.IDAffaire, UpdateSourceTrigger=PropertyChanged}"
                                          DisplayMemberPath="Numero"
                                          SelectedValuePath="ID"
                                          />
                            </DataTemplate>
                        </ig:TemplateColumn.EditorTemplate>
                    </ig:TemplateColumn>

    Ma combo est bien binder, seul hic, l'exception qui se montre lorsque je choisis une valeur dans la combobox et qu'elle perd le focus.

    {"Une liaison TwoWay ou OneWayToSource ne peut pas fonctionner sur la propriété en lecture seule 'CommandeFournisseurLigne' de type 'ViewModel.CommandeFournisseurLigneViewModel'."}


    Edit :

    Je crois avoir trouvé. J'ai rajouter ceci :

    public CommandeFournisseurLigne CommandeFournisseurLigne
            {
                get { return ObjectEntity as CommandeFournisseurLigne; }
    
    //Rajout pour l'exception sur OneWay/TwoWay
                set { ObjectEntity = value; }
     
            }
    

    Qu'en pensez vous ? Je cherche à respecter le MVVM au maximum.






    mardi 8 juillet 2014 07:17
  • Bonjour

    On a déplacé votre thread dans le forum dédié WPF.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 14 juillet 2014 07:03