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

C# Discussion :

Nouvel ObservableCollection d'une ObservableCollection en distinct


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Par défaut Nouvel ObservableCollection d'une ObservableCollection en distinct
    Bonjour tout le monde

    Petite question à deux balles :

    j'ai une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     [XmlRoot]
     public class Deperdition :
    [XmlAttribute]
            public string Piece { get; set; }
     [XmlAttribute]
            public bool IsRegrouper{ get; set; }
     [XmlAttribute]
            public double Deperditions { get; set; }
     
    etc ...

    mon XML :
    je ne met pas toutes les infos exprès j'en ai beaucoup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Piece= "Logement T01" Local="Salon" IsFiltrer="True" Deperditions= "1000"
    Piece= "Logement T01" Local="Cuisine"  IsFiltrer="True" Deperditions= "1000"
    Piece= "Logement T01" Local="Salle de bain"  IsFiltrer="True" Deperditions= "1000"
    Piece= "Logement T02" Local="Salon"  IsFiltrer="True" Deperditions= "1000"
    Piece= "Logement T02" Local="Cuisine"  IsFiltrer="True" Deperditions= "1000"
    Piece= "Logement T02" Local="Salle de bain"  IsFiltrer="True" Deperditions= "1000"
    j'ai une observable collection de ma classe que me récupère tout.

    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
     
    public ObservableCollection<Deperdition> ListDeperdition
            {
                get
                {
                    return _ListDeperdition;
                }
                set
                {
                    if (value != _ListDeperdition)
                    {
                        _ListDeperdition = value;
     
                        OnPropertyChanged("ListDeperdition");
     
                    }
     
                }
            }
    j'aurais voulu récupérer dans une list ou observablecollection les info suivantes : Piece en distinct() et IsFilter
    Je ne vois pas trop comment faire afin de pouvoir filtrer ma listview via :

    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
    41
    42
    43
    44
    45
    46
    47
     
      <Style TargetType="{x:Type ListViewItem}">
                                        <Setter Property="Visibility" Value="{Binding Path=IsFiltrer, Converter={StaticResource VisibilityConverter}}"/>
    </Style>
     
    et : 
     
      <Expander>
                                    <StackPanel Margin="10,4,0,0">
                                        <ScrollViewer Grid.Row="1" Margin="0,5,0,30"
                                              HorizontalScrollBarVisibility="Disabled" 
                                              VerticalScrollBarVisibility="Auto">
                                            <StackPanel>
                                                <CheckBox Content="(Selectionnez tout)" IsChecked="{Binding IsSelectionnezToutPiece, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                                <ListView  Background="{x:Null}" BorderThickness="0" FontSize="10" Margin="0"
                                           ItemsSource="{Binding ListLocalFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, IsAsync=True}" IsSynchronizedWithCurrentItem="True" Width="auto" Height="100">
                                                <ListView.ItemContainerStyle>
                                                    <Style TargetType="ListViewItem">
                                                        <Setter Property="HorizontalContentAlignment" Value="Left" />
                                                    </Style>
                                                </ListView.ItemContainerStyle>
                                                <ListView.View>
                                                    <GridView ColumnHeaderContainerStyle="{StaticResource MasqueHeader}">
                                                        <GridViewColumn >
                                                            <GridViewColumn.CellTemplate >
                                                                <DataTemplate>
                                                                    <CheckBox IsChecked="{Binding IsFiltrer}" VerticalContentAlignment="Center" >
                                                                        <TextBlock Text="{Binding Local}" Margin="0,-2,0,0"/>
                                                                    </CheckBox>
                                                                </DataTemplate>
                                                            </GridViewColumn.CellTemplate>
                                                        </GridViewColumn>
                                                    </GridView>
                                                </ListView.View>
                                            </ListView>
                                            </StackPanel>
                                        </ScrollViewer>
                                        <StackPanel>
                                            <Button ToolTip="Enregistrer les modifications" Command="{Binding SaveFiltrePieceCommand}" BorderBrush="{x:Null}" Background="{x:Null}" Margin="3" Width="16" Height="16" HorizontalAlignment="Right">
                                                <TextBlock>
                        <Image Source="/Apeiron;component/Utils/Images/Ok.png" Height="12" Width="12" Stretch="Fill" RenderOptions.BitmapScalingMode="HighQuality"/>
                                                </TextBlock>
                                            </Button>
                                            <Button/>
                                        </StackPanel>
                                    </StackPanel>
                                </Expander>

    Pouvez vous me donnez un petit coup de mail s'il vous plait cela serait pas de refus

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Je ne sais pas si j'ai bien compris ta demande.
    Mais j'ai au moins compris que tu souhaitais regrouper ta liste par pièce

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    myList.Select(p => p.Piece).Distinct();

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    J'ai un peu de mal à saisir ce que tu cherches à faire, sur quoi tu veux regrouper, quelles sont les données à agréger. Est-ce-que tu peux préciser ton contexte ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Par défaut
    Bonjour popo et Noxen

    Tout d'abord merci pour vos réponses
    Pour te répondre Noxen :
    Etant débutant je voulais pas m'embarquer dans quelquechose de trop compliqué pour moi pour le moment à savoir la CollectionView qui permet de filtrer etc ...
    Mon but premier était et est toujours de trouver des choses simple à mettre en place pour arriver au même résultat, (chose que je ne comprends pas tout le temps parfois ... pas facile d'être autodidacte ...)
    Du coup, je me suis demander si je pouvais passé outre la CollectionView et résoudre mon problème de filtre en passant par le xaml et je suis partit sur un style et un converter :

    Xaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <UserControl.Resources>
            <local:BooleanToVisibilityConverter x:Key="VisibilityConverter"/>
        </UserControl.Resources>
     
     <ListView.ItemContainerStyle>
                                        <Style TargetType="{x:Type ListViewItem}">
                                            <Setter Property="Visibility" Value="{Binding Path=IsFiltrer, Converter={StaticResource VisibilityConverter}}"/>
     </Style>
     
                                    </ListView.ItemContainerStyle>
    Converter :

    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
     
     public class BooleanToVisibilityConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                bool boolValue = (bool)value;
                boolValue = (parameter != null) ? !boolValue : boolValue;
                return boolValue ? Visibility.Visible : Visibility.Collapsed;
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

    Du coup à partir de mon ObservableCollection de ma Itemsource de ma Listview je voulais refaire une ObservableCollection pour faire mon Popup Filtre.
    Je suis parti à recrée une nouvelle classe :

    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
     
      public class FilterDeperdition
        {
            private Nullable<bool> _IsFiltrer = true;
            public string Local { get; set; }
            public Nullable<bool> IsFiltrer
            {
                get
                {
                    return _IsFiltrer;
                }
                set
                {
                    _IsFiltrer = value;
     
                }
            }
    }
    Donc à partir d'un togglebutton je me à true l'ouverture de mon Popup :


    Xaml :

    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
    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
     
    mon toggle button : 
     
     <ToggleButton x:Name="ButtonFilterLocal" Margin="0,0,0,0" IsChecked="{Binding IsOpenLocalFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                                        <ToggleButton.Template>
                                            <ControlTemplate>
                                                <Image Source="/Apeiron;component/Utils/Images/filter.png" Width="10" Height="10" />
                                            </ControlTemplate>
                                        </ToggleButton.Template>
                                    </ToggleButton>
     
    et mon Popup 
     
    <Popup Name="popCountry" Placement="Bottom" IsOpen="{Binding IsOpenLocalFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PlacementTarget="{Binding ElementName=ButtonFilterLocal}" StaysOpen="False" Width="150">
                                <Border Background="White" BorderBrush="Gray" BorderThickness="1,1,1,1">
                                    <StackPanel Margin="5,5,5,5">
     
     
                                        <ScrollViewer Grid.Row="1" Margin="0,5,0,5"
                                              HorizontalScrollBarVisibility="Auto" 
                                              VerticalScrollBarVisibility="Auto" >
                                            <ListView  Background="{x:Null}" BorderThickness="0" FontSize="10" Margin="0" SelectionMode="Single"
                                           ItemsSource="{Binding ListLocalFilter , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, IsAsync=True}" SelectedItem="{Binding SelectedLocalFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="False" Width="auto" Height="100">
                                                <ListView.ItemContainerStyle>
                                                    <Style TargetType="ListViewItem">
                                                        <Setter Property="HorizontalContentAlignment" Value="Left" />
                                                        <Style.Triggers>
                                                            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                                                                <Setter Property="IsSelected" Value="True"/>
                                                            </Trigger>
                                                        </Style.Triggers>
                                                    </Style>
                                                </ListView.ItemContainerStyle>
                                                <ListView.View>
                                                    <GridView ColumnHeaderContainerStyle="{StaticResource MasqueHeader}">
                                                        <GridViewColumn >
                                                            <GridViewColumn.CellTemplate >
                                                                <DataTemplate>
                                                                    <CheckBox IsChecked="{Binding IsFiltrer}" Content="{Binding Local}" VerticalContentAlignment="Center"  >
     
                                                                        <i:Interaction.Triggers>
                                                                            <i:EventTrigger EventName="Checked" >
                                                                                <i:InvokeCommandAction Command="{Binding DataContext.IsCheckedSelectionnezToutCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}" />
                                                                            </i:EventTrigger>
     
                                                                            <i:EventTrigger EventName="Unchecked" >
                                                                                <i:InvokeCommandAction Command="{Binding DataContext.IsUnCheckedSelectionnezToutCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}" />
                                                                            </i:EventTrigger>
                                                                        </i:Interaction.Triggers>
                                                                    </CheckBox>
                                                                </DataTemplate>
                                                            </GridViewColumn.CellTemplate>
                                                        </GridViewColumn>
                                                    </GridView>
                                                </ListView.View>
                                            </ListView>
     
                                        </ScrollViewer>
                                        <Button HorizontalAlignment="Right" Command="{Binding AppliquezFilterCommand}">
                                            <Button.Template>
                                                <ControlTemplate>
                                                    <Image Source="/Apeiron;component/Utils/Images/Ok.png" Width="15" Height="15"  RenderOptions.BitmapScalingMode="HighQuality" Stretch="Fill"/>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>
                                    </StackPanel>
                                </Border>
                            </Popup>
    et mon 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
       public bool IsOpenLocalFilter
            {
                get
                {
                    return _IsOpenLocalFilter;
                }
     
     
                set
                {
                    if (value != _IsOpenLocalFilter)
                    {
                        _IsOpenLocalFilter = value;
                        if (IsOpenLocalFilter == true && ListDeperdition != null)
                        {
                            if (ListLocalFilter == null)
                            {
                            ListLocalFilter = new ObservableCollection<FilterDeperdition>();
     
                            foreach (string cust in ListDeperdition.Select(w => w.Local).Distinct().OrderBy(w => w))
                            {
                                ListLocalFilter.Add(new FilterDeperdition { Local = cust, IsFiltrer = true });
     
                            }
     
                            var item = new FilterDeperdition { Local = "(Sélectionnez tout)", IsFiltrer = true };
                            ListLocalFilter.Insert(0, item);
                            OnPropertyChanged("ListLocalFilter");
                            }
     
     
                        }
                        OnPropertyChanged("IsOpenLocalFilter");
                    }
                }
            }
    Résultat : Nom : Sans titre.png
Affichages : 330
Taille : 144,7 Ko

    Du Coup après avoir désélectionnez les items choisi le code de mon button OK :

    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
     
     
     RelayCommand appliquezfilterCommand;
    public ICommand AppliquezFilterCommand
            {
                get
                {
                    if (appliquezfilterCommand == null)
                        appliquezfilterCommand = new RelayCommand(param => this.AppliquezFilter());
     
                    return appliquezfilterCommand;
                }
            }
     
     public void AppliquezFilter()
            {
                foreach (var item in ListLocalFilter)
                {
                    foreach (var lis in ListDeperdition)
                    {
                        if (item.Local == lis.Local)
                        {
                            lis.IsFiltrer = item.IsFiltrer;
                        }
                    }
                }
                OnPropertyChanged("ListDeperdition");
                IsOpenLocalFilter = false;
            }

    Le résultat de mon filtre :
    Nom : Sans titre1.png
Affichages : 297
Taille : 145,8 Ko
    Nom : Sans titre2.png
Affichages : 247
Taille : 143,0 Ko


    Voila, un truc franchement plus simple à comprendre pour moi qui suis encore un débutant et ne maîtrise pas toutes les ficelles de la programmation

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

Discussions similaires

  1. Sortir une nouvel ObservableCollection d'un ObservableCollection
    Par Ganeshiva dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 14/04/2017, 13h40
  2. [Débutant] ObservableCollection dans une ObservableCollection WPF C#
    Par viktor56 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 23/02/2015, 16h39
  3. Réponses: 2
    Dernier message: 25/06/2010, 17h45
  4. Comment lier une observableCollection à un ListView
    Par inmotion dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 29/05/2010, 11h45
  5. Probleme de binding avec une observableCollection
    Par Yogy dans le forum Silverlight
    Réponses: 4
    Dernier message: 10/06/2009, 17h50

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