2016-01-26 2 views
0

У меня есть это свойство внутри ReactiveObject:Эквивалентность в ReactiveUI?

bool IsValid => Children.All(child => child.IsValid); 

Проблема заключается в том, что, конечно, это не вызывает каких-либо уведомления об изменении, когда дети изменяются (их свойство «IsValid»).

Как это сделать в ReactiveUI?

Примечание:

  • Ребенок является ReactiveObject тоже.
  • Я могу изменить оба класса, родительский и детей, чтобы соответствовать предписаниям и рекомендациям RxUI без ограничения .
+0

Создает ли 'child.IsValid' событие' PropertyChanged'? – pmbanka

+0

Ребенок - это ReactiveObject. Я могу моделировать его свободно. Как я могу распространять изменения от ребенка к родительскому? Семантика того, что я хочу сделать, это: «Я прав, если мои дети верны». – SuperJMN

ответ

4

ObservableAsPropertyHelper < BOOL> является то, что вам нужно, если вашим детей свойства является реактивным списком можно объединить Изменено и ItemChanged наблюдаемых и есть что-то вроде:

public class MyViewModel : ReactiveObject 
    { 
     private readonly ObservableAsPropertyHelper<bool> _isValidPropertyHelper; 

     public MyViewModel() 
     { 
      var listChanged = Children.Changed.Select(_ => Unit.Default); 
      var childrenChanged = Children.ItemChanged.Select(_ => Unit.Default); 
      _isValidPropertyHelper = listChanged.Merge(childrenChanged) 
               .Select(_ => Children.All(c => c.IsValid)) 
               .ToProperty(this, model => model.IsValid); 

     } 
     public bool IsValid 
     { 
      get { return _isValidPropertyHelper.Value; } 
     } 

     public ReactiveList<Item> Children { get; set; } 
    } 
+1

Предполагается, что OP хочет обновить 'MyViewModel.IsValid' только при добавлении/удалении/замене дочернего элемента, а не при изменении' child.IsValid'. Я не уверен, что это было его намерением. – pmbanka

+0

Вы правы. Этого я хочу. – SuperJMN

+0

@ ds-b Извините, но я чувствую, что ваш ответ не работает :( – SuperJMN

Смежные вопросы