2016-03-28 29 views
0

IValueConverter güncellemeleri yayılmasını nedeniyle: görünüm tarafındaReactiveList Şu anda bir kaydı düzenlemeye operatörlerin e-posta adresleri oluşan bir özelliğe sahip

public ReactiveList<string> Operators { get; set; } 

, ben kayıtları bir ListView var ve bunların her biri bir simge için Geçerli kullanıcının düzenleme operatörü olup olmadığını gösterir.

<FontIcon Glyph="&#xE104;" Visibility="{Binding Operators, 
    Converter={StaticResource IsUserEditingToVisibilityConverter} }" /> 

Sorunum bir güncelleme Operatörleri oluştuğunda IsUserEditingToVisibilityConverter ait dönüştürme() yöntemi tetiklenir olmamasıdır. - Eğer bir şey yapmak olsaydı gibi

// Taken from https://blogs.msdn.microsoft.com/mim/2013/03/11/tips-winrt-converter-parameter-binding/ 
public class IsUserEditingToVisibilityConverter : DependencyObject, IValueConverter 
{ 
    public UserVm CurrentUser 
    { 
     get { return (UserVm)GetValue(CurrentUserProperty); } 
     set { SetValue(CurrentUserProperty, value); } 
    } 

    public static readonly DependencyProperty CurrentUserProperty = 
     DependencyProperty.Register("CurrentUser", 
            typeof(UserVm), 
            typeof(IsUserEditingToVisibilityConverter), 
            new PropertyMetadata(null)); 

    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (this.CurrentUser == null) return Visibility.Collapsed; 
     if (this.CurrentUser.EmailAddress == null) return Visibility.Collapsed; 
     var operators = value as IList<string>; 
     if (operators != null && operators.Contains(this.CurrentUser.EmailAddress)) 
     { 
      return Visibility.Visible; 
     } 
     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

cevap

0

Text bağlanarak sadece burada Operators değişiklikleri günceller: Burada

<TextBlock Text="{Binding Operators[0]}" /> 

IsUserEditingToVisibilityConverter kod var: Ben hata ayıklama amacıyla ayarlanan bir TextBlock olsa güncelleme yapar gibi:

Operators = new ReactiveList<string>{"first", "second"}; 

veOperators (PropertyChanged yükseltilir sağlar) aşağıda olarak ilan edilmiştir:

public ReactiveList<string> Operators 
{ 
    get { return _operators; } 
    set { this.RaiseAndSetIfChanged(ref _operators, value); } 
} 

O öğeleri ekleyebilir veya listeden öğeleri kaldırmaz güncelleme eğer.

Burada bir dönüştürücüde çok fazla şey yaptığınızı düşünüyorum - bu davranış, Görünüm Modelinde daha iyi olacaktır. Bir CurrentUser özelliği, bir Operators listesi var ve ReactiveUI en ObservableAsPropertyHelperCurrentUser veya Operators ya değişti güncelleme olacağını kullanarak mal beyanında ediyorum:

private readonly ObservableAsPropertyHelper<bool> _isUserEditing; 

public ReactiveList<string> Operators { get; } = new ReactiveList<string>(); 

public UserVm CurrentUser 
{ 
    get { return _currentUser; } 
    set { this.RaiseAndSetIfChanged(ref _currentUser, value); } 
} 

public bool IsUserEditing => _isUserEditing.Value; 

Ve oluşturucu içinde: WhenCurrentUserEditing ile

Operators.Changed.Select(_ => Unit.Default) 
    .StartWith(Unit.Default) 
    .Select(_ => WhenCurrentUserEditing()) 
    .Switch() 
    .ToProperty(this, x => x.IsUserEditing, out _isUserEditing); 

uygulanan olarak:

private IObservable<bool> WhenCurrentUserEditing() 
{ 
    return this.WhenAnyValue(x => x.CurrentUser.EmailAddress) 
     .Select(Operators.Contains); 
} 
+0

Bir ReactiveList öğesinin eklenmesini tetikleyeceğini düşündüm. ed/kaldırıldı ... Ayrıca, alt viewmodel'deki Operatörler hakkında bilgi sahibi olsaydım, bu durumda çözümün iyi olacağını anladım. – ericdes