Подписка на изменения во вложенном списке со свойством, связанным с флажком
Я пытаюсь запретить пользователю продолжать работу, пока он не выберет хотя бы один элемент в списке. Список привязан к отдельному элементу управления представлением внутри основного представления, и у модели представления списка есть bool с двухсторонней привязкой к флажку в своем представлении. Команда continue является частью основной модели представления, поэтому, чтобы попытаться прослушать изменения, я создаю производный список
tempList = this.WhenAnyValue(x => x.Items,
(layers) => layers == null ? Enumerable.Empty<bool>() : layers.CreateDerivedCollection(x => x.Selected))
.ToProperty(this, x => x.TempList);
CanContinue = this.WhenAnyValue(m => m.CollectionInfo, m => m.TempList,
(collectionDatabase, tempItems) =>
{
if (collectionDatabase == null || tempItems == null) return false;
var temp = tempItems.Any(x => x == true);
return temp;
});
Проблема в том, что TempList никогда не меняется. Я вижу изменение свойства Selected на дочерней модели представления, но это все.
Я также попытался назначить TempList как
tempList = Items.Changed.Select(_ => Items.Select(gr => gr.Selected))
.ToProperty(this, x => x.TempList);
У кого-нибудь есть предложения? Модель данных вне моего контроля, так как в реальном приложении я загружаю наборы данных с диска, которые могут содержать один или несколько наборов данных. У меня есть пример приложения, которое демонстрирует проблему, если вы хотите попробовать это сами.
1 ответ
Мне удалось ее решить, важными битами являются установка ChangeTrackingEnabled = true в ReactiveList и последующая подписка на уведомление ItemChanged для коллекции, это означает, что TempList больше не нужен. Я также изменил предикат для команды, чтобы использовать int с количеством выбранных элементов.
var canContinue = this.WhenAnyValue(x => x.NumSelected, num => num > 0);
this.WhenAnyObservable(x => x.Items.ItemChanged)
.Subscribe(_ => NumSelected = Items.Count(i => i.Selected));