1

I noted something wrong, either it's from me or a bug when experimenting with .Net MAUI.

I have an ObservableCollection property :

 public ObservableCollection<LotoModel> Lotteries { get; set; } = new();

and an ObservableProperty (using community mvvm toolkit) :

[ObservableProperty]
public string _lotteriesCount = "A";

When ever I click/touch a Button I load my Lotteries collection. (tested with an hard coded 4 static LotoModel items) :

static GridModel _testGM1 = new GridModel { Name = "TEST Grid #1", Start = 0, End = 10, NumberOfDraw = 2 };
static GridModel _testGM2 = new GridModel { Name = "TEST Grid #2", Start = 0, End = 20, NumberOfDraw = 5 };
static GridModel _testGM3 = new GridModel { Name = "TEST Grid #3", Start = 0, End = 30, NumberOfDraw = 8 };
static GridModel _testGM4 = new GridModel { Name = "TEST Grid #4", Start = 0, End = 50, NumberOfDraw = 10 };
static LotoModel _testLM1 = new LotoModel { Name = "TEST Lottery #1", IsFavorite = true, Grids = new ObservableCollection<GridModel> { _testGM1, _testGM2 } };
static LotoModel _testLM2 = new LotoModel { Name = "TEST Lottery #2", IsFavorite = false, Grids = new ObservableCollection<GridModel> { _testGM3, _testGM4 } };

And the Button command Task :

async Task GetLotteriesAsync()
{
    if (IsBusy)
        return;
    try 
    {
        IsBusy = true;

        _buttonCount++;
        LotteriesCount = _buttonCount.ToString();

        if (Lotteries.Count != 0)
            Lotteries.Clear();

        Lotteries.Add(_testLM1);
        Lotteries.Add(_testLM2);
        Lotteries.Add(_testLM1);
        Lotteries.Add(_testLM2);

    }
    catch (Exception e)
    {
        Log.Error(e, "Error while trying to get our lotteries");
        await Application.Current.MainPage.DisplayAlert("Error!", e.Message, "OK");
    }
    finally
    {
        IsBusy = false;
    }
}

So each time I touch/click my Button, LotteriesCount string property get's updated with a static int counter field value :

static int _buttonCount = 0;

That is OK.

Now I also update this property via this CollectionChangedEventHandler :

public LotteriesVM(LotteryService lotteryService)
{   
    GetLotteriesCommand = new Command(async () => await GetLotteriesAsync());

    Lotteries.CollectionChanged += LotteriesChangedMethod;
}

private void LotteriesChangedMethod(object sender, NotifyCollectionChangedEventArgs e)
{
    LotteriesCount = _lotteriesCount + "_" + Lotteries.Count.ToString();
}

And now here the unexpected behavior : The label only update the counter part of it string property, the remaining "_1_2_3_4" added in the handler doesn't get updated in UI.

Note that I'm using a Android Pixel 5 emulator from VS 17.3 preview.

And I also noted that if I force orientation of the emulated android device, then the Label is updated ! Even more, if I force a XAML MinimalWidthRequest="200" for my Label, then it is correctly updated now !

<!-- without MinimumWidthRequest, the label update only after forcing a screen orientation-->
<Label Text="{Binding LotteriesCount}" MinimumWidthRequest="200" HorizontalOptions="Center" FontAttributes="Bold" FontSize="22" TextColor="OrangeRed"/>

So am I doing something wrong or it is a bug ? Thank you.

TRex
  • 127
  • 1
  • 8
  • Not sure what maybe wrong in your code but in this case I would use a Converter or Message – antokhio Jul 09 '22 at 20:25
  • 1
    I see various reports of dynamic update problems [bugs when change after page appears] in this build (maybe only on Android, not sure) due to a recent change in layout/arrange. That change is rolled back to previous, working version, in forthcoming release. Expected sometime this month; is on a monthly release cycle, synced to .net 6 updates. – ToolmakerSteve Jul 09 '22 at 20:30

0 Answers0