IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[MVVM] Comment garder un couplage faible entre l'UI et la VM lors d'un binding à partir d'une requête LINQ ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Points : 85
    Points
    85
    Par défaut [MVVM] Comment garder un couplage faible entre l'UI et la VM lors d'un binding à partir d'une requête LINQ ?
    Bonjour,
    Je débute avec MVVM et l'excellent MVVM Light de Laurent Bugnion. Je créé une appli avec une vue maître et une vue détail, et dans ma vue maître j'ai une TextBox qui permet à l'utilisateur de rechercher un texte et une listBox qui met en jour en temps réel son contenu en fonction de la frappe utilisateur. Ensuite, en sélectionnant un des items de la listBox présenté lorsque la recherche est terminée, la vue détail sera peuplée.

    Pour le moment, j'ai créé mes entités avec Entity Framework. J'arrive à lancer ma recherche lorsque le contenu de ma TextBox est modifié avec un EventToCommand :

    XAML :
    Code xaml : 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
    <UserControl x:Class="TrackTime.Views.MasterViewUserControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
                 xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"  
                 mc:Ignorable="d" 
                 d:DesignHeight="600" d:DesignWidth="400" Background="#FFCE2D2D"
                 DataContext="{Binding Master, Source={StaticResource Locator}}">
     
     
        <Grid Background="#FF6C5656">
            <Grid.RowDefinitions>
                <RowDefinition Height="200" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="400*" />
            </Grid.RowDefinitions>        
            <DockPanel Height="70" DockPanel.Dock="Top" Margin="0,0,0,130">
                <TextBox Style="{DynamicResource WaterMarkTextBoxStyle}" Name="TextBoxSortProjects" Height="50" Margin="10" FontFamily="Myriad Pro" FontSize="32" VerticalContentAlignment="Center" Text="{Binding SearchedText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="TextChanged">
                            <cmd:EventToCommand Command="{Binding SortTextChanged}"/>                                            
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </TextBox>
            </DockPanel>      
            <DockPanel Grid.Row="2" Name="dockPanel1" DockPanel.Dock="Top" >
                <ListBox Name="listBoxProjects" Margin="10">
     
                </ListBox>
            </DockPanel>
        </Grid>
    </UserControl>

    VM :
    Code c# : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     public class MasterProjectsViewModel : ViewModelBase
        {
            #region Variables
            DataBaseModel_Container _context = new DataBaseModel_Container();
            #endregion
            /// <summary>
            /// Initializes a new instance of the MasterProjectsViewModel class.
            /// </summary>
            public MasterProjectsViewModel()
            {
                SortTextChanged = new RelayCommand(TextChangedCommand,
                    TextChangedCommandCanExecute);
     
                GetProjects = new RelayCommand(getProjects);
     
                getAllProjects();
            }
            #region Properties
     
            #region SearchedText property
            /// <summary>
            /// The <see cref="SearchedText" /> property's name.
            /// </summary>
            public const string SearchedTextPropertyName = "SearchedText";
     
            private string _searchedText = String.Empty;
     
            /// <summary>
            /// Sets and gets the SearchedText property.
            /// Changes to that property's value raise the PropertyChanged event. 
            /// </summary>
            public string SearchedText
            {
                get
                {
                    return _searchedText;
                }
     
                set
                {
                    if (_searchedText == value)
                    {
                        return;
                    }
     
                    _searchedText = value;
                    RaisePropertyChanged(SearchedTextPropertyName);
                }
            }
            #endregion
     
            #endregion
     
            #region Commands
            #region SearchEntry Command
     
            public RelayCommand SortTextChanged
                {
                    get;
                    private set;
                }
     
                private void TextChangedCommand()
                {
                    getProjects();
                }         
     
                private bool TextChangedCommandCanExecute()
                {
                    bool isExecutable = (_searchedText.Length > 3) ? true : false;
                    return isExecutable;
                }
     
                #endregion   
    #region GetProjects Command
     
                public RelayCommand GetProjects
                {
                    get; private set;
                }
     
                private void getProjects()
                {
                    var matchingProjectsRequest = from projects in _context.ProjectJeu
                                                  where
                                                      (projects.Name.Contains(_searchedText) ||
                                                       (projects.Description.Contains(_searchedText)))
                                                  select projects;
     
     
                    //Comment faire un binding propre? 
     
                }
     
                private void getAllProjects()
                {
     
                    var allProjectsRequest = from projects in _context.ProjectJeu                                          
                                                  select projects;
                    //if (e != null)
     
                }
     
                #endregion       
            #endregion
        }

    Je suis absolument fan du découplage complet entre l'Ui et la VM que MVVM offre. Sauf que là, je ne vois pas comment bien binder mon résultat de requête LINQ to Entity qui est déclenché lorsqu'on tape dans la TextBox... Tous les exemples que j'ai vu le font en code-behind sur la vue, en liant fortement la listbox à la logique métier.

    Quelles sont les bonnes pratiques pour que mon binding se fasse entre le résultat de ma requête LINQ to Entities et ma listBox sans qu'à aucun moment la VM n'aie à savoir que c'est une listBox qui affiche dans la vue?

    Quelles sont les bonnes pratiques là-dessus? J'avais commencé à faire une commande toute simple que je bindais sur ma ListBox, mais une fois dans la VM je ne voyais pas comment faire... Avec une propriété qui expose ma ListBox? Mais ça voudrait dire que c'est fortement lié entre la VM et l'UI...

    Bref, je nage ! J'espère avoir été clair, merci d'avance pour vos lumières !
    N'hésitez pas à me demander plus d'informations.

    Nicolas

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Le résultat de ta requête doit être assigné à une propriété de ton VM qui est elle-même blindée dans ta listbox. Un petit Raisepropertychanged quand la requête est assignée et le tour est joué.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre régulier Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Points : 85
    Points
    85
    Par défaut
    Merci beaucoup! C'est super simple en plus... Mais j'ai trop en tête le schéma 1 propriété d'un contrôle = 1 propriété VM.
    La première question à se poser en WPF : quelle propriété dois-je exposer dans mon VM pour afficher ce que je veux dans ma vue?

    Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Comment écrire une "querystring" à partir d'une requête SQL
    Par baocrazy dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2012, 17h17
  2. Comment programmer la construction d'une requête LINQ ?
    Par SpongeRobert dans le forum Linq
    Réponses: 4
    Dernier message: 01/09/2009, 10h05
  3. Réponses: 7
    Dernier message: 06/04/2009, 16h29
  4. comment créer un array js à partir d'une requête PHP Mysql
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/08/2008, 23h29
  5. Réponses: 3
    Dernier message: 20/05/2007, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo