2016-03-28 7 views
0

私は現在、レコードの編集オペレータの電子メール・アドレスで構成プロパティ持たへの更新を伝播しません:ビュー側ではReactiveListはIValueConverter

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

を、私はレコードのリストビューを持ち、それらのそれぞれのアイコン現在のユーザーが編集オペレータであるかどうかを示します。

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

私の問題は、更新がオペレータに発生したときにIsUserEditingToVisibilityConverterの変換()メソッドがトリガされていないということです。 - あなたが何かをしたかのように

// 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(); 
    } 
} 

答えて

0

Textへの結合はここでしかOperators変更を更新します。ここでは

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

IsUserEditingToVisibilityConverterのコードです:私は目的をデバッグするための設定のTextBlockはかかわらず、更新はありません以下のような:

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

Operatorsは(PropertyChangedが発生していることを保証する)以下のように宣言されました:

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

それはあなたに項目を追加したり、リストから項目を削除する場合更新されません。

ここでは、おそらくコンバータであまりにも多くのことをやっていると思います。この動作は、ビューモデルではうまくいくはずです。あなたはCurrentUser財産、Operatorsリストを持っている、とCurrentUserまたはOperatorsのいずれかが変更されたときに更新してしまうことReactiveUIのObservableAsPropertyHelperを使用してプロパティを宣言したい:

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; 

そしてコンストラクタで:WhenCurrentUserEditing

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

実装します次のようになります:

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

ReactiveListはアイテムadd ed/removed ...また、サブビューモデルでオペレータに関する情報があった場合、あなたのソリューションはうまくいくと思いますが、そうではありません。 – ericdes

関連する問題