2017-01-06 3 views
0

Ich habe eine CollectionViewSource CollectionOfVideos an ObservableCollection ListOfVideos gebunden. Diese CollectionViewSource ist die ItemsSource für das DataGrid dataGrid_Video. Ich habe eine Gruppierung von lShortName von label von ListOfVideos implementiert. Wenn Elemente zu DataGrid hinzugefügt werden, scheint die Gruppierung zu funktionieren, da sie alle hinzugefügten Elemente nach dem Standard label gruppiert.DataGrid-Gruppierung wird bei Änderung von CollectionViewSource nicht aktualisiert

Problem ist, Gruppierung wird nicht aktualisiert, wenn label des Elements geändert wird. Hier ist mein Code:

Window.Resources in MainWindow.xaml

<CollectionViewSource x:Key="CollectionOfVideos" Source="{Binding fosaModel.ListOfVideos, UpdateSourceTrigger=PropertyChanged}" IsLiveGroupingRequested="True" IsLiveSortingRequested="True" > 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="label" Converter="{StaticResource LTSConverter}"/> 
    </CollectionViewSource.GroupDescriptions> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="label.lShortName"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

dataGrid_Video in MainWindow.xaml

 <DataGrid x:Name="dataGrid_Video" 
      AutoGenerateColumns="False" 
      Margin="0,0,0,0" 
      Grid.Row="1" 
      ItemsSource="{Binding Source={StaticResource CollectionOfVideos}}" 
      GridLinesVisibility="Horizontal" 
      SelectedItem="{Binding fosaModel.SelectedVideo}" 
      SelectedIndex="{Binding fosaModel.SelectedVideoIndex}" 
      SelectionUnit="FullRow" 
      SelectionMode="Single"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding fName}" Header="Nazwa" IsReadOnly="True"></DataGridTextColumn> 
       <DataGridTextColumn Binding="{Binding AudioToSync}" Header="Dźwięk"></DataGridTextColumn> 
      </DataGrid.Columns> 
      <DataGrid.GroupStyle> 
       <GroupStyle> 
        <GroupStyle.HeaderTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> 
          </StackPanel> 
         </DataTemplate> 
        </GroupStyle.HeaderTemplate> 
        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="{x:Type GroupItem}"> 
             <Expander IsExpanded="True"> 
              <Expander.Header> 
               <StackPanel Orientation="Horizontal"> 
                <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"/> 
               </StackPanel> 
              </Expander.Header> 
              <ItemsPresenter /> 
             </Expander> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </GroupStyle.ContainerStyle> 
       </GroupStyle> 
      </DataGrid.GroupStyle> 
     </DataGrid> 

Hier ist meine fosaModel

public class fosaModel : INotifyPropertyChanged 

    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public ObservableCollection<fosaVideo> ListOfVideos { get; set; } = new ObservableCollection<fosaVideo>(); 
     public ObservableCollection<fosaAudio> ListOfAudios { get; set; } = new ObservableCollection<fosaAudio>(); 
     public ObservableCollection<fosaLabel> ListOfLabels { get; set; } = new ObservableCollection<fosaLabel>(); 
     public fosaVideo SelectedVideo { get; set; } 
     public int SelectedVideoIndex { get; set; } = -1; 
     public fosaAudio SelectedAudio { get; set; } 
     public int SelectedAudioIndex { get; set; } = -1; 
     public fosaLabel SelectedLabel { get; set; } 
     public int SelectedLabelIndex { get; set; } = -1; 
     public string WorkingDir { get; set; } = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     public double videoProgress { get; set; } 
     public int SliderValue { get; set; } 
     public bool IsDialogClosed { get; set; } = true; 

    } 

Es gibt nur wenige Dinge, die Sie wissen sollten:

  • Ich benutze Fody.PropertyChanged, so dass es Benachrichtigung Problem nicht Property ist. Das Hinzufügen neuer Elemente zur Liste aktualisiert das DataGrid.
  • Sortierung funktioniert auch nicht.
  • Ändern label von bestimmten Artikel in ListOfVideos Arbeit hat, überprüfte ich in Debug
  • Ich dachte, es ist ein Problem mit Punktnotation von PropertyName in GroupingDescriptions war, also habe ich einen Konverter gegeben. Mit oder ohne Konverter - Problem existiert noch.
  • Es gibt auch sehr ähnliche CollectionViewSource, mit Sortierung implementiert, und es funktioniert beim Hinzufügen neuer Artikel.
  • Ich benutze MVVM Light und ich möchte es MVVM Art und Weise halten.

Antwort

1

Sie sollten die Namen der Eigenschaften hinzufügen Gruppe zu leben, indem auf die LiveGroupingProperties Sammlung des Collection:

<CollectionViewSource x:Key="CollectionOfVideos" Source="{Binding fosaModel.ListOfVideos, UpdateSourceTrigger=PropertyChanged}" 
           IsLiveGroupingRequested="True" IsLiveSortingRequested="True" 
           xmlns:s="clr-namespace:System;assembly=mscorlib"> 
    <CollectionViewSource.LiveGroupingProperties> 
     <s:String>label</s:String> 
    </CollectionViewSource.LiveGroupingProperties> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="label" Converter="{StaticResource LTSConverter}"/> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Es ist das gleiche für die Live-Sortierung: https://wpf.2000things.com/2014/01/16/988-enabling-live-sorting-in-a-collectionviewsource/

ich nicht tun Ich denke, das wird mit verschachtelten Eigenschaften wie "label.lShortName" funktionieren. Wenn Sie also nach einer Untereigenschaft des Typs T in Ihrer ObservableCollection<T> sortieren möchten, müssen Sie dem Typ T eine Eigenschaft hinzufügen, die die Untereigenschaft umschließt y, z .:

public string lShortName 
{ 
    get { return label.lShortName; } 
    set { label.lShortName = value; NotifyPropertyChanged(); } 
} 
+0

Implementierung 'INotifyPropertyChanged' in einer Klasse von ListOfVideos ganz gut funktionierte, habe ich nicht einmal jene LiveGroupingProperties hinzufügen. Es stellte sich heraus, dass es sich um das PropertyChanged-Problem handelte. Vielen Dank! –

Verwandte Themen