视图中的 CollectionView 在清除 viewmodel 中的 observablecollection 后不再更新

问题描述 投票:0回答:0

从主页导航到第二页并在列表中选择一个项目,属性加载到第二个网格列上就好了。但是,当我选择列表中的另一个项目并清除并重新填充属性集合时,视图不会更新。我错过了什么?

Model.cs

using CommunityToolkit.Mvvm.ComponentModel;

namespace Model;

public class Data : ObservableObject
{
    public string Number {get;set;}

    public string Group {get;set;}

    public string DateTime {get;set;}

    public Data(){}

    public Data(List<object> objList)
    {
        int i=0;
        foreach (System.Reflection.PropertyInfo property in typeof(Data).GetProperties().ToList())
        {           
            property.SetValue(this, objList[i]);
            i++;            
        }
    }   
}

public class PropertiesList : ObservableObject
{
    public string Key {get;set;}

    public string Value {get;set;}

    public PropertiesList(string key, string value)
    {
        Key = key;
        Value = value;  
    }   
}

SecondPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.SecondPage"
             xmlns:model="clr-namespace:Model"
             xmlns:viewmodel="clr-namespace:Viewmodel"
             xmlns:collections="clr-namespace:CommunityToolkit.Mvvm.Collections;assembly=CommunityToolkit.Mvvm"             
             x:DataType="viewmodel:SecondPageViewModel">

       <ContentPage.Resources>
              <Style TargetType="Grid">
                     <Setter Property="VisualStateManager.VisualStateGroups">
                            <VisualStateGroupList>
                                   <VisualStateGroup x:Name="CommonStates">
                                          <VisualState x:Name="Normal" />
                                          <VisualState x:Name="Selected">
                                                 <VisualState.Setters>
                                                        <Setter Property="BackgroundColor" Value="LightGray" />
                                                 </VisualState.Setters>
                                          </VisualState>
                                   </VisualStateGroup>
                            </VisualStateGroupList>
                     </Setter>
              </Style>
       </ContentPage.Resources>     
       
       <Grid Margin="20" RowSpacing="20" RowDefinitions="*,Auto" ColumnDefinitions="*">
              <Grid Grid.Row="0" Margin="20" RowSpacing="20" RowDefinitions="*" ColumnDefinitions="*,2*">
                     <Frame Grid.Column="0" BorderColor="Gray" CornerRadius="10" HasShadow="True">                    
                            <CollectionView ItemsSource="{Binding ObsDataList}" IsGrouped="True" SelectionMode="Single" SelectedItem="{Binding SelectedData, Mode=TwoWay}" SelectionChanged="OnDataSelectionChanged">
                                   <CollectionView.GroupHeaderTemplate>
                                          <DataTemplate x:DataType="collections:IReadOnlyObservableGroup">                                   
                                                 <Grid RowDefinitions="Auto" ColumnDefinitions="*">
                                                        <Label Text="{Binding Key}" BackgroundColor="LightGray" FontSize="18" FontAttributes="Bold" />
                                                 </Grid>                                   
                                          </DataTemplate>
                                   </CollectionView.GroupHeaderTemplate>
                                   <CollectionView.ItemTemplate>
                                          <DataTemplate x:DataType="model:Data">
                                                 <Grid Padding="10" RowDefinitions="Auto" ColumnDefinitions="Auto,Auto,Auto,*" ColumnSpacing="50">
                                                        <Label Grid.Column="0" Text="{Binding Number}" FontSize="20" HorizontalOptions="Center" VerticalOptions="Center" FontAttributes="Bold"/>                                                                                                                                           
                                                        <VisualStateManager.VisualStateGroups>
                                                               <VisualStateGroup Name="CommonStates">                        
                                                                      <VisualState Name="Selected">
                                                                             <VisualState.Setters>
                                                                                    <Setter Property="BackgroundColor" Value="LightBlue" />
                                                                             </VisualState.Setters>
                                                                      </VisualState>
                                                               </VisualStateGroup>
                                                        </VisualStateManager.VisualStateGroups>
                                                 </Grid>
                                          </DataTemplate>
                                   </CollectionView.ItemTemplate>
                            </CollectionView>             
                     </Frame>
                     <Frame Grid.Column="1" BorderColor="Gray" CornerRadius="10" HasShadow="True">
                            <Grid RowDefinitions="*" ColumnDefinitions="*">
                                   <CollectionView Grid.Column="0" ItemsSource="{Binding ObsDataProperties}" SelectionMode="None">
                                          <CollectionView.ItemTemplate>
                                                 <DataTemplate x:DataType="model:PropertiesList">
                                                        <Frame BorderColor="Gray" CornerRadius="10">
                                                               <Grid RowDefinitions="Auto" ColumnDefinitions="200,200" RowSpacing="2">
                                                                      <Label Grid.Column="0" Text="{Binding Key}" FontSize="10" HorizontalOptions="Start" VerticalOptions="Center" FontAttributes="Bold"/>                                                                                                                                          
                                                                      <Label Grid.Column="1" Text="{Binding Value}" FontSize="10" HorizontalOptions="Start" VerticalOptions="Center" />
                                                               </Grid>
                                                        </Frame>
                                                 </DataTemplate>
                                          </CollectionView.ItemTemplate>
                                   </CollectionView>   
                            </Grid>
                     </Frame>
              </Grid>
              <Frame Grid.Row="1" BorderColor="Gray" CornerRadius="10" HasShadow="True">
                     <Grid RowDefinitions="Auto" ColumnDefinitions="*,*,*" ColumnSpacing="10">
                            <Button TextColor="White" FontAutoScalingEnabled="True" Text="Clear" Command="{Binding ClearDataInfoCommand}" HeightRequest="33" HorizontalOptions="Start"/>
                     </Grid>
              </Frame>
       </Grid>

</ContentPage>

SecondPage.xaml.cs

using Model;
using Viewmodel;


namespace Test;

public partial class SecondPage : ContentPage
{
    public SecondPage(SecondPageViewModel viewmodel)
    {
        InitializeComponent();
        BindingContext = viewmodel;
    }

    protected override void OnNavigatedTo(NavigatedToEventArgs args)
   {            
        ((SecondPageViewModel)this.BindingContext).GetDataCommand.Execute(null);                
        
        base.OnNavigatedTo(args);       
   }
   
    void OnDataSelectionChanged(object sender, SelectionChangedEventArgs e)
    {        
        if (e.CurrentSelection.Count() != 0) 
            ((SecondPageViewModel)this.BindingContext).ShowDataInfoCommand.Execute(e.CurrentSelection.FirstOrDefault() as Data);            
    }

}

SecondPageViewModel.cs

using Model;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Collections;
using System.Collections.ObjectModel;

namespace Viewmodel;

public partial class SecondPageViewModel : BaseViewModel
{
    private IEnumerable<IGrouping<string, Data>> groupedDataList;
    
    [ObservableProperty]
    public Data selectedData;
    
    public ObservableCollection<PropertiesList> ObsDataProperties {get;} = new();

    public ObservableGroupedCollection<string, Data> ObsDataList {get;}  = new();

    public SecondPageViewModel(IServiceProvider provider) : base(provider){} 
    
    [RelayCommand]
    public async Task GetDataAsync()
    {       
        if (ObsDataList.Count is not 0) ObsDataList.Clear();

        if (ObsDataProperties.Count is not 0) ObsDataProperties.Clear(); 

        await Task.Delay(0);

        List<Data> dataList = new List<Data>()
        {
            new Data
            (
                new List<object>
                {
                    "DATA1",
                    "GROUP1",                    
                    "DATETIME"
                }                               
            ),
            new Data
            (            
                new List<object>
                {
                    "DATA2",
                    "GROUP2",
                    "DATETIME"   
                } 
            )        
        };     

        groupedDataList =  dataList.GroupBy(data => data.Group);  

        foreach(var dataGroup in groupedDataList)
        {            
            ObsDataList.AddGroup(dataGroup);
        }       
                
    }
    
    [RelayCommand]
    public void ShowDataInfo(Data data)
    {      
        if (ObsDataProperties.Count is not 0) ObsDataProperties.Clear();       

        foreach (System.Reflection.PropertyInfo property in data.GetType().GetProperties())
        {
            ObsDataProperties.Add
            (
                new PropertiesList
                (
                    property.Name,
                    property.GetValue(data).ToString()
                )        
            );
        }       
    }

    [RelayCommand]
    public void ClearDataInfo()
    {     
        if (ObsDataProperties.Count is not 0) ObsDataProperties.Clear();

        SelectedData = null;
    }
}

我希望在选择列表中的另一个项目后看到更新的视图。 感谢您的帮助。

mvvm view viewmodel maui collectionview
© www.soinside.com 2019 - 2024. All rights reserved.