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 :

Refresh WPF Observable Collection


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Par défaut Refresh WPF Observable Collection
    Bonjour,

    J'ai un petit souci en WPF.
    Je créé une application qui doit synchroniser plusieurs types de données et pouvoir les manipuler quelque soit l'écran une fois ces données synchroniser.

    Mon application est basé sur des TabControls et des TabsItem.
    Chaque TabItem correspond à un UserControl.

    Exemple :
    Code xml : 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
    <TabControl Style="{StaticResource BlueTabControl}" x:Name="TabControlSynchronisation" SelectionChanged="TabControlSynchronisation_SelectionChanged">
    			<TabItem Header="Global" Style="{DynamicResource BlueTabItem}" MinWidth="100" Height="40" Cursor="Hand">
    				<Grid>
    					<local:SynchronisationGlobalView />
    				</Grid>
    			</TabItem>
    			<TabItem Header="Article &amp; Remise" Style="{DynamicResource GreenTabItem}" MinWidth="100" Height="40" Cursor="Hand">
    				<Grid>
    					<local:SynchronisationArticleRemiseView />
    				</Grid>
    			</TabItem>
    			<TabItem Header="Client" Style="{DynamicResource OrangeTabItem}" Width="100" Height="40" Cursor="Hand">
    				<Grid>
    					<local:SynchronisationClientView />
    				</Grid>
    			</TabItem>
    			<TabItem Header="Commande" Style="{DynamicResource MagentaTabItem}" MinWidth="100" Height="40" Cursor="Hand">
    				<Grid>
    					<local:SynchronisationCommandeView />
    				</Grid>
    			</TabItem>
    			<TabItem Header="Action" Style="{DynamicResource PurpleRedTabItem}" MinWidth="100" Height="40" Cursor="Hand">
    				<Grid>
    					<local:SynchronisationActionView />	
    				</Grid>
    			</TabItem>
    		</TabControl>

    Un UserControl se charge de la synchronisation (dans cet exemple, je synchronise des familles d'articles).
    Ma synchronisation récupère une liste de famille sur le serveur distant et l'écrit dans une base de données "local".

    Ma base de données est donc remplie de famille après la synchronisation.

    Un de mes UserControl doit afficher ma liste de famille, pour ce fait j'ai donc effectuer un list en linq to sql de ma table famille et retourne une observable collection :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public ObservableCollection<Famille> List()
            {
                System.Linq.IQueryable<Famille> Return = from Table in this.DBLocal.Famille
                                                         select Table;
                return new ObservableCollection<Famille>(Return.ToList());
            }

    Mon problème se situe ici :
    - Si je vais sur mon UserControl affichant mes familles avant de synchroniser mes familles et que j'y retourne après, mon UserControl n'est pas rafraîchit.
    Mon but ici est de rafraîchir dynamiquement mon observable collection une fois ma synchronisation finie.

    Mon UserControl comprend un datagrid affichant ces familles :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <DataGrid ItemsSource="{Binding ListFamilleSync}" HorizontalAlignment="Left" x:Name="DataGridFamilleSync" Margin="240,40,0,0" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" SelectionMode="Single" GridLinesVisibility="None" HeadersVisibility="Column" IsReadOnly="True" Width="560" Height="200" VerticalAlignment="Top" d:LayoutOverrides="VerticalAlignment" RowHeight="30">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Code" x:Name="DataGridTexBoxColumnFamilleSyncCode" Width="100" Binding="{Binding Fam_CodeFamille}" />
                    <DataGridTextColumn Header="Intitulé" x:Name="DataGridTexBoxColumnFamilleSyncIntitule" Binding="{Binding Fam_Intitule}" Width="321" />
                    <DataGridTemplateColumn Header="Supprimer" Width="120">
                        <DataGridTemplateColumn.CellTemplate >
                            <DataTemplate>
                                <Button Cursor="Hand" x:Name="DataGridFamilleSyncDelete" >Supprimer</Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

    Ce UserControl est nommé ConfigurationArticleView

    Mon ViewModel est nommé ConfigurationArticleViewModel et comprend :
    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
    public class ConfigurationArticleViewModel : ViewModelBase
        {
            #region Member Fields
     
            private ObservableCollection<Model.Local.Famille> m_ListFamilleSync;
     
            private ObservableCollection<Model.Local.Famille> m_ListFamilleNotSync;
     
            #endregion
     
            #region Properties
            public ObservableCollection<Model.Local.Famille> ListFamilleSync
            {
                get
                {
                    return this.m_ListFamilleSync;
                }
                set
                {
                    this.m_ListFamilleSync = value;
                    OnPropertyChanged("ListFamilleSync");
                }
            }
     
            public ObservableCollection<Model.Local.Famille> ListFamilleNotSync
            {
                get
                {
                    return this.m_ListFamilleNotSync;
                }
                set
                {
                    this.m_ListFamilleNotSync = value;
                    OnPropertyChanged("ListFamilleNotSync");
                }
            }
            #endregion
     
            #region Constructors()
            public ConfigurationArticleViewModel()
            {
                Model.Local.FamilleRepository FamilleRepository = new Model.Local.FamilleRepository();
                this.ListFamilleSync = FamilleRepository.ListSyncOrderByCodeFamille(true);
                this.ListFamilleNotSync = FamilleRepository.ListSyncOrderByCodeFamille(false);
            }
            #endregion

    Et dans le .cs de mon UserControl, j'ai :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public ConfigurationArticleView()
    		{
    			this.InitializeComponent();
                this.DataContext = new ViewModel.Configuration.ConfigurationArticleViewModel();
    		}

    Ma question est donc : Comment puis je recharger dynamiquement mon observablecollection (ou mon datacontext) sachant que je n'ai pas possibilité (à ma connaissance) de changer le statut d'un datacontext à partir d'un autre usercontrol.

    En espérant que vous m'ayez compris, merci d'avance pour vos réponses

  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 : 50
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Si tu utilises un framework MVVM, comme MVVM Light ou autre, tu dois avoir un système de messaging. Tu peux alors envoyer un message disant qu'une synchro est faite, et à charge des viewmodels concernés de se rafraîchir.

Discussions similaires

  1. [Débutant] Problématique pour le binding des éléments d'une Observable Collection
    Par mrflamby dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 07/09/2015, 13h12
  2. Réponses: 7
    Dernier message: 17/04/2014, 09h31
  3. Observable Collection - Data Binding
    Par quentin869 dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 15/02/2014, 12h44
  4. Linq, est-il possible de filtrer une observable collection ?
    Par Golzinne dans le forum Silverlight
    Réponses: 2
    Dernier message: 14/11/2011, 20h31
  5. [WPF] Comment binder une sous-collection d'une collection ?
    Par BruceWayne dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 04/06/2007, 16h55

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