Я столкнулся со странным поведением в моем приложении WinUI 3, когда ListView отображает коллекцию элементов. CheckBox в каждом шаблоне элемента привязан к логическому свойству IsComplete. Это многоклиентное приложение, синхронизируемое с сервером, в котором изменения данных могут происходить от разных клиентов и синхронизироваться через сервер.
Подробнее:
- Когда я устанавливаю или снимаю флажок с флажка CheckBox для любого элемента в приложении WinUI, он работает правильно и обновляет свойство IsComplete, как и ожидалось.
- Когда в элементы вносятся изменения в другом клиенте, и эти изменения синхронизируются с сервером, а затем переносятся в это приложение WinUI, все элементы правильно отражают обновления как в привязанной коллекции, так и в пользовательском интерфейсе, за исключением первого элемента в ListView.
- CheckBox и TextBlock первого элемента визуально не обновляются в соответствии с новым значением IsComplete после синхронизации с сервером, даже если привязанные данные были обновлены правильно (проверено на этапе отладки).
Код: Выделить всё
[*] Grid.Row="1"
Margin="10"
ItemsSource="{x:Bind ViewModel.Items}"
ScrollViewer.VerticalScrollBarVisibility="Auto">
Код: Выделить всё
[ObservableProperty]
private ConcurrentObservableCollection items = [];
[RelayCommand]
public async Task RefreshItemsAsync(CancellationToken cancellationToken = default)
{
try
{
IsRefreshing = true;
// Synchronize data with the remote service (if any).
await service.SynchronizeAsync(cancellationToken);
// Pull all items from the database.
IEnumerable itemsFromDatabase = await service.TodoItems.OrderBy(item => item.Id).ToListAsync(cancellationToken);
// Replace all the items in the collection.
Items.ReplaceAll(itemsFromDatabase);
//Items.Clear();
//_ = Items.AddRange(itemsFromDatabase);
}
catch (Exception ex)
{
NotificationHandler?.Invoke(this, new NotificationEventArgs(ex.GetType().Name, ex.Message, true));
}
finally
{
IsRefreshing = false;
NotificationHandler?.Invoke(this, new NotificationEventArgs("Items Refreshed", "", false));
}
}
Код: Выделить всё
public class TodoItem : OfflineClientEntity
{
private bool _isComplete = false;
public string Title { get; set; } = string.Empty;
public bool IsComplete { get; set; } = false;
public override string ToString()
=> JsonSerializer.Serialize(this);
}
using System;
using System.ComponentModel.DataAnnotations;
namespace TodoApp.WinUI3.Database;
///
/// An abstract class for working with offline entities.
///
public abstract class OfflineClientEntity
{
[Key]
public string Id { get; set; }
public DateTimeOffset? UpdatedAt { get; set; }
public string Version { get; set; }
public bool Deleted { get; set; }
}
Нажатие флажка непосредственно в пользовательском интерфейсе обновляет IsComplete и правильно отражает изменения.
[*]Когда другой клиент изменяет первый элемент и синхронизирует изменения, и эти изменения переносятся в приложение WinUI, связанное свойство IsComplete корректно обновляется для первого элемента (проверяется с помощью TextBlock), но флажок CheckBox визуальное состояние не отражает это изменение.
[*]Все остальные элементы в списке ведут себя должным образом, как при непосредственном изменении в пользовательском интерфейсе, так и при обновлении при синхронизации с сервером.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ty-changes