UWP - проблема просмотра модели и нескольких представлений

Мне нужно знать, почему один и тот же элемент, который появляется на моей странице три раза, отображается только один раз.

Элемент Achat de Voiture, который появляется в Недавние ..., также должен появиться в Закреплено и Нужно внимание; это не так. Вместо этого у нас есть пустое место, показывающее пустой элемент.

На мой взгляд, это связано с тем, что одна и та же модель представления повторно используется для трех представлений. НО. Это проблема?

ОБНОВИТЬ

О коде - код модели представления может быть слишком длинным для публикации, а код XAML частично взят из настраиваемого представления списка (из другой сборки)

Информация, которая может помочь - Приложение работает отлично. Эта проблема возникла недавно, я считаю, что причиной может быть одно из этих действий, которые я недавно сделал:

  • Я изменил свою библиотеку Firebase
  • Я изменил свою локальную библиотеку базы данных с Lex.db на LiteDB
  • Я обновил свой пакет Xamarin.Forms
  • Вчера обновил Win10

Я надеюсь, это поможет

ОБНОВЛЕНИЕ 2 (код)

XAML-код ItemTemplate

<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width = "*" />
                    <ColumnDefinition Width = "auto" />
                    <ColumnDefinition Width = "10" />
                </Grid.ColumnDefinitions>
                <StackLayout Grid.Column = "0" Orientation = "Horizontal">
                    <Label Text = "{Binding Name}" 
                            VerticalOptions = "Center" 
                            LineBreakMode = "TailTruncation" />
                    <Label Text = "{Binding ContactName}" 
                            VerticalOptions = "Center" 
                            LineBreakMode = "TailTruncation" 
                            TextColor = "{StaticResource secondary_text}">
                        <Label.IsVisible>
                            <OnIdiom x:TypeArguments = "x:Boolean" Desktop = "True" Tablet = "True" TV = "True"  Phone = "False" />
                        </Label.IsVisible>
                    </Label>
                    <baseView:FALabel Icon = "FACalendarCheckO"
                                        IsVisible = "{Binding HasDue}"
                                        TextColor = "{StaticResource secondary_text}" 
                                        VerticalOptions = "Center"  />
                    <Label Text = "{Binding FormattedDueDateAgo}" 
                            IsVisible = "{Binding HasDue}" FontAttributes = "Italic"
                            LineBreakMode = "HeadTruncation" 
                            HorizontalOptions = "FillAndExpand"
                            TextColor = "{StaticResource secondary_text}" 
                            VerticalOptions = "Center" />
                    <baseView:FALabel Icon = "{Binding EmotionIcon}" 
                                    TextColor = "{Binding EmotionColor}" 
                                    BackgroundColor = "Transparent" 
                                    IsVisible = "{Binding HasEmotion}" 
                                    VerticalOptions = "Center" HorizontalOptions = "EndAndExpand" />
                </StackLayout>
                <Label Grid.Column = "1" Text = "{Binding DisplayAmountWithCurrency}" 
                        TextColor = "{Binding DisplayAmountTextColor}" 
                        HorizontalOptions = "End"
                        VerticalOptions = "Center" 
                        LineBreakMode = "NoWrap" />
                <BoxView Grid.Column = "2" BackgroundColor = "{Binding DueAmountTextColor}" HorizontalOptions = "FillAndExpand" />
            </Grid>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>

Ставлю BindingContext

//I made the mothod async to avoid the page to freeze the second time it is instantiated
protected async override void OnAppearing()
{
    base.OnAppearing();
    if (BindingContext == null)
    {
        HVM = new HomePageVM();
        BindingContext = HVM;
    }

    if (CurrentCount != Main.API.DebtsDB.Entries.Count)
    {
        CurrentCount = Main.API.DebtsDB.Entries.Count;
        var l = Main.API.DebtsDB.Entries.ToList();
        l.Sort((x, y) => (y.Modified.CompareTo(x.Modified) * 1024) + (x.IsFather.CompareTo(y.IsFather) * -1));
        var Pending = new HomeDataGroup(l.Where((d) => d.IsNormalDebt && !d.StatusIgnored && !d.IsFather && !d.StatusValidated && d.HasDue && Math.Abs((d.DueDate - Core.Main.Now).TotalDays) < 90))
        {
            Title = "Close (90 days)",
            Icon = FontIcon.FACalendar,
            ShortTitle = "C",
        };
        var Pinned = new HomeDataGroup(l.Where((d) => d.IsNormalDebt && (d.PinnedUp || d.PinnedUpPlus)))
        {
            Title = "Pinned",
            Icon = FontIcon.FAThumbTack,
            IconColor = (Color)Application.Current.Resources["pinned_color"],
            ShortTitle = "P",
        };
        var Attention = new HomeDataGroup(l.Where(d => d.IsNormalDebt && d.EmotionWarning))
        {
            Title = "Need Attention",
            Icon = Cash.GetEmotionIcon(BaseEmotion.Warning),
            IconColor = Cash.GetEmotionColor(BaseEmotion.Warning),
            ShortTitle = "A",
        };
        var NotValidated = new HomeDataGroup(l.Where(d => d.IsNormalDebt && !d.StatusIgnored && !d.IsFather && !d.HasDue && !d.StatusValidated))
        {
            Title = "Awaiting Confirmation",
            Icon = FontIcon.FACheck,
            IconColor = (Color)Application.Current.Resources["pinned_color"],
            ShortTitle = "C",
        };
        var Recents = new HomeDataGroup(l.Where((d) => d.IsNormalDebt && (Main.Now - d.ModifiedDate).Days < 14))
        {
            Title = "Recents (2 weeks ago)",
            Icon = FontIcon.FAClockO,
            ShortTitle = "R",
        };

        var ls = new List<HomeDataGroup>();
        if (Pinned.Count > 0)
            ls.Add(Pinned);
        if (Pending.Count > 0)
            ls.Add(Pending);
        if (Attention.Count > 0)
            ls.Add(Attention);
        if (NotValidated.Count > 0)
            ls.Add(NotValidated);
        if (Recents.Count > 0)
            ls.Add(Recents);

        await Task.Delay(200); // The page was freezing without this
        HVM.HomeItems = ls;
    }
}

DebtsDB - это класс, который я использую для получения моделей и создания моделей представления.

DebtsDB = new Core.DB.RunningDB<Cash, CashVM>();
public class RunningDB<T, T_VM> : IRunningDB<T>
        where T : BaseHistory
        where T_VM : BaseHistory, new()
{
    public RunningDB()
    {
        Entries = new ObservableCollection<T_VM>();
        CacheEntries = new Dictionary<string, T_VM>();
    }
    public RealtimeDatabase<T> DB => IDB as RealtimeDatabase<T>;
    private IRealtimeDatabase IDB { get; set; }
    public ObservableCollection<T_VM> Entries { get; set; }
    public Dictionary<string, T_VM> CacheEntries { get; set; }

    IDisposable Subscription;
    public void Observe()
    {
        try
        {
            var a = (from tr in DB.AsObservable()
                     where !string.IsNullOrEmpty(tr.Key)
                     select new { tr }
                     );
            Subscription = a.Subscribe(onNext: pair => Observe(pair.tr.Key, pair.tr.Object, Entries, CacheEntries));
        }
        catch (Exception ex)
        {
            Main.AppStatus.OnError(new ErrorData { Ex = ex, FuncName = "Observe" });
        }

    }
    protected void Observe(string key, T o, Collection<T_VM> l, Dictionary<string, T_VM> cache)
    {
        try
        {
            Main.AppStatus.IsRefreshing = false;
            if (o == null || o.StatusDeleted)
                ObserveDeleted(key, l, cache);
            else
                ObserveUpdate(key, o, l, cache);
        }
        catch (Exception ex)
        {
            Main.AppStatus.OnError(new ErrorData { Ex = ex, FuncName = "Observe" });
        }
    }
    protected async void ObserveUpdate(string key, T o, Collection<T_VM> l, Dictionary<string, T_VM> cache)
    {
        o.Key = key;
        T_VM o_vm = BaseHistory.Create<T, T_VM>(o);
        o_vm.Load();
        if (!cache.ContainsKey(key))
        {
            cache[key] = o_vm;
            await CrossCollection.Current.AddAsync(l, o_vm);
        }
        else
        {
            cache[key] = o_vm;
            for (int j = 0; j < l.Count; j++)
            {
                if (l[j].Key == key)
                {
                    await CrossCollection.Current.ReplaceAsync(l, j, o_vm);
                    break;
                }
            }
        }
    }
    protected async void ObserveDeleted<B_VM>(string key, Collection<B_VM> l, Dictionary<string, B_VM> cache)
        where B_VM : BaseHistory
    {
        if (cache.ContainsKey(key))
        {
            await CrossCollection.Current.RemoveAsync(l, cache[key]);
            cache.Remove(key);
        }
    }

    public async Task Pull()
    {
        await IDB.PullAsync();
    }
}

ViewModel

public class CashVM : Cash, IBasePicture, IBaseHistoryVM, ISelectable
{
    public CashVM()
    {
        Main.AppStatus.PropertyChanged += Status_PropertyChanged;
    }
    public string DisplayDate => HasDue ? (char)FontIcon.FACalendarCheckO + " " + FormattedDueDate : FormattedStartDate;
    public string DisplayAmount => CashExt.FormatAmmoutWithSign(Amount, StatusIgnored, StatusValidated);
    public string DisplayBaseAmount => (BaseAmount != 0 && !this.DebtShouldSum() ?
        (BaseAmount > 0 ? "+" : "-")
        : "") + FormattedBaseAmount;
    public string DisplayAmountWithCurrency => Core.Main.Setting.UserSetting.Currency.AmountWithCurrency(DisplayAmount);
    public string DisplayBaseAmountWithCurrency => Core.Main.Setting.UserSetting.Currency.AmountWithCurrency(DisplayBaseAmount);

    public Color DisplayAmountTextColor => StatusIgnored || !StatusValidated ?
        (Color)Main.App.Resources["secondary_text"]
        : AmountTextColor;
    public Color DisplayBaseAmountTextColor => !this.DebtShouldSum() ?
        (Color)Main.App.Resources["secondary_text"]
        : BaseAmountTextColor;
    public bool NeedValidation => !IsFather && !StatusIgnored && !StatusValidated;
    public bool ContactVisible => !HasParentContact && !string.IsNullOrEmpty(ContactName);
    public bool SubjectVisible => !HasParentSubject && !string.IsNullOrEmpty(Name);
    public override void Load()
    {
        base.Load();
    }
}

UWP - проблема просмотра модели и нескольких представлений

Нам нужно немного больше информации - в идеале опубликуйте свой код XAML и просмотрите исходный код модели :-)

Martin Zikmund 09.05.2018 17:46

Я действительно подозреваю, что проблема будет в XAML, поэтому это особенно важно.

Martin Zikmund 09.05.2018 17:49

Я только что обновил вопрос кодом

Fabrice T 10.05.2018 09:51

Я не мог использовать ваш код, чтобы сделать простой образец и воспроизвести эту проблему. Не могли бы вы поделиться простым образцом?

CoCaIceDew 28.05.2018 10:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
210
0

Другие вопросы по теме