Dynamically updating GroupDescriptor PropertyName

I can't seem to figure out the right Xaml syntax to enable dynamic updates of the group contents.

Context: 

I'm binding a collection to SfListView.SelectedItem where the collection implements INotifyCollectionChanged and each collected item implements INotifyPropertyChanged. GroupDescription PropertyName is set to a property on the collection item. 

Expected Results: 

When I update the 'group' property on an item, I expect it to be displayed in the updated group. NOTE: 

I've verified in the debugger that the PropertyChanged event is getting raised when I updat the associated 'group' property. 


 Here's the associated Xaml:

<syncfusion:SfListView x:Name="Mazes"

                        ItemsSource="{Binding Mazes}"

                        SelectedItem="{Binding Mazes.SelectedItem, Mode=TwoWay}"

                        ItemTemplate="{StaticResource MazeItemTemplate}"

                        SelectionMode="Single"

                        HorizontalOptions="Center"

                        VerticalOptions="Fill"

                        ItemSize="200"

                        IsStickyGroupHeader="True"

                        >

    <syncfusion:SfListView.DataSource>

        <data:DataSource LiveDataUpdateMode="AllowDataShaping">

            <data:DataSource.GroupDescriptors>

                <data:GroupDescriptor PropertyName="Meta.Theme"/>

            </data:DataSource.GroupDescriptors>

        </data:DataSource>

    </syncfusion:SfListView.DataSource>

</syncfusion:SfListView>




12 Replies 1 reply marked as answer

DT Daniel Travison January 29, 2024 10:17 PM UTC

I've narrowed the problem further and it comes down to nested bindings.

The collection contains a Model class with a public property Meta and the GroupDescription PropertyName is bound to Meta.Theme.

Even though Meta raises a PropertyChanged event when Theme changes, the GroupDescription doesn't update.  FWIW: my ItemTemplate also has binding references to Meta properties (e.g. Meta.Title, Meta.Description, etc.) and they update when these properties change. (e.g., I'm binding Meta.Title in the ItemTemplate for ListView items and I see the ListView item rendering updates when these properties change).

If I update the Model class with a Theme property and relay the PropertyChanged event through the Model.PropertyChanged event, the GroupDescription  is updated in the ListView and the item is displayed in the updated group.

In short, binding to Model.Meta.Theme does not update dynamically but binding to Model.Theme does.



SY Suthi Yuvaraj Syncfusion Team January 30, 2024 08:57 PM UTC

Hi Daniel Travison, 

We have analyzed the reported query, and we have created the sample with nested binding, we are unable to reproduce the issue at our end. We have attached the tested sample, Please have a look at the sample and let us know if we have missed any customization that you have done in your sample. If the issue persists, Kindly share the code snippet related to the model and data population, Grouping related code snippet, the SfListView setting, and any other customization to find the solution as soon as possible.

UG Link: https://help.syncfusion.com/maui/listview/grouping

Regards,

Suthi Yuvaraj.


Attachment: ListView_1bb3634b.zip


DT Daniel Travison January 31, 2024 02:48 PM UTC

I could not tease out why your code works but mine does not so I've created a sample app that reproduces the problem I'm seeing:

DanTravison/ListViewNestedBinding (github.com)

By default, the sample repros the problem when the nested Meta.Theme property is changed in the details view.  Editing MainPage.xaml and setting the PropertyName to the relay property illustrates how removing the nested binding works.

I understand that this work around will fix the one-off case but it will be problematic when I start providing additional grouped views (e.g. Author, Theme, Difficulty, etc.)

Thanks.



SY Suthi Yuvaraj Syncfusion Team February 2, 2024 04:27 PM UTC

Daniel Travison,


We would like to inform you that after analyzing the sample you provided, we have successfully replicated the issue on our end. It appears that the problem arises when the Group descriptor property name is modified during runtime if it is not a direct property of the binding context of the listview item (i,e MetaModel)We suspect that notification for property changes is not triggered in the source with groups when it is not directly binding. We are currently validating the issue at our end, we will update you with further details on or before January 7, 2024.We will appreciate your patience until then.


As of now we suggest you use the below workaround to overcome the issue , we have manually invoked the refresh call for groups in listview 

public MainPage()

{

    BindingContext = new MainViewModel();

    InitializeComponent();

    listView.DataSource.SourcePropertyChanged += DataSource_SourcePropertyChanged;

}

 

private void DataSource_SourcePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)

{

    if(e.PropertyName == "Theme")

    {

        listView.DataSource.Refresh();

    }

       

}



SY Suthi Yuvaraj Syncfusion Team February 5, 2024 09:29 AM UTC

Daniel Travison,

Sorry for the inconvenience caused, as we mentioned earlier, we suspect that notification for property changes is not triggered in the source with groups when it is not directly binding. We are currently validating the issue at our end, we will update you with further details on or before February 7, 2024. We will appreciate your patience until then.



SY Suthi Yuvaraj Syncfusion Team February 7, 2024 02:06 PM UTC

Daniel Travison.


#Regarding property change reflects in ItemTemplate but not in GroupDescriptor


The Meta.Title property is bound to the Label within the SfListView.ItemTemplate. When modifications occur in the underlying data source, the PropertyChanged event is automatically triggered at the source level, ensuring that the connected UI elements are updated accordingly. In the case of GroupDescriptor, the Meta.Theme will be set to the PropertyName property, which is not properly triggered, this discrepancy can be particularly noticeable when working with nested model classes within the GroupDescriptor context, the Key Property in GroupDescriptor is not updated properly.


# Regarding Group Descriptor property


By passing the proper Model name in the PropertyChanged will rectify the issue this is the proper syntax for nesting binding, we have attached the code changes in PropertyChanged and workable sample for your reference.



Attachment: ListViewNestedBindingmain_(1)_4bdfbf1.zip


DT Daniel Travison February 7, 2024 07:02 PM UTC

I believe you're suggesting that the Meta class should use the property name 'Meta.Theme' versus 'Theme' when raising the PropertyChanged event.

If that is the case, that breaks encapsulation.  The Meta class has no knowledge of what the containing object uses for the property name when it exposes the Meta instance. 

Additionally, it will break binding when binding directly to the Meta class. In other words, if I have a view with a binding context set to an instance of a Meta, I would not expect to bind properties using "Meta." + PropertyName.

Perhaps I'm misunderstanding the suggestion because I don't see anything in the sample you included in your reply that shows the above change.



DV Diwakar Venkatesan Syncfusion Team February 8, 2024 02:51 PM UTC

Daniel Travison, 

We apologize for any inconvenience caused. We understand your scenario and are prioritizing this issue accordingly. We will provide you with further validation details by Feb 09, 2024. We recommend using the previous suggestion (calling DataSource.Refresh) to overcome this issue until then.

We appreciate your patience in the meantime.

Regards,
Diwakar V



DV Diwakar Venkatesan Syncfusion Team February 9, 2024 01:29 PM UTC

Daniel Travison,

After analyzed, we have logged a bug report for the reported issue “Dynamically updating GroupDescriptor PropertyName is not working in SfListView”. We will fix the issue and include it in our upcoming weekly nuget which is scheduled for Feb 20, 2024. We will let you know once it is released with the fix. We appreciate your patience until then.


You can also track the status of the report from the below link.

Feedback Groups are not updating for on-demand changes when set property in nested class for GroupDescriptor in .NET MAUI | Feedback Portal (syncfusion.com)


Disclaimer: The inclusion of this solution in the weekly release may change due to other factors including but not limited to QA checks and works reprioritization.


Regards,

Diwakar V



SY Suthi Yuvaraj Syncfusion Team February 22, 2024 01:51 PM UTC

Daniel Travison,

 

We would like to let you know that Essential Studio Weekly NuGet packages (v24.2.7) have been published in nuget.org with the fix for the issue “Dynamically updating GroupDescriptor PropertyName”. Please let us know if you have any concerns about this.

 

RootCause of the issue:

When we set nested property name to GroupDescriptor.PropertyName, PropertyChanged event is not invoked at the source level for on-demand item manipulation.


Marked as answer

DT Daniel Travison replied to Suthi Yuvaraj February 22, 2024 02:56 PM UTC

I have confirmed this is fixed usingSyncfusion.Maui.ListView v24.2.7 in both the sample and my application.



JS Jayashree Suresh Anand Syncfusion Team February 23, 2024 07:15 AM UTC

Hi Daniel,

We are glad it has been fixed, please let us know if you need any further assistance. We will be happy to help you. 

Regards,

Jayashree 


Loader.
Up arrow icon