2016-12-15 10 views
1

入力テキストのcetain条件が満たされていない場合、特定のエラーメッセージを設定しようとしています。入力されたURLが空の場合反応的なUI共有観測可能な論理

は基本的に、私は

を「サーバーのURLがhttpsで始まる必要があります」でなければなりません入力されたURLがhttps ErrorHintに起動しない場合ErrorHintが

「サーバーのURLを空にすることはできません」に設定したいです

それ以外の場合、ErrorHintは空の文字列にする必要があります。

以下のコードは機能しますが、私は観察対象のロジックを複製しているように感じます。これを行うためのよりクリーンな方法がありますか?

 // invalid if the server url is empty 
     var serverUrlEmptyObservable = 
      this.WhenAnyValue(x => x.NewServerUrl) 
       .Where(string.IsNullOrWhiteSpace); 

     // invalid if the url is not empty but does not start with https 
     var serverUrlInvalidPrefixObservable = 
      this.WhenAnyValue(x => x.NewServerUrl) 
       .Where(x => !string.IsNullOrWhiteSpace(x)) 
       .Where(x => !x.StartsWith(NewServerUrlRequiredPrefix)); 

     // valid if the server url is not empty and starts with proper prefix 
     var validServerUrlObservable = 
      this.WhenAnyValue(x => x.NewServerUrl) 
       .Where(x => !string.IsNullOrWhiteSpace(x)) 
       .Where(x => x.StartsWith(NewServerUrlRequiredPrefix)); 

     // set error message based on which observable fires 
     ErrorHint = Observable.Merge(
      validServerUrlObservable.Select(x => ""), 
      serverUrlInvalidPrefixObservable.Select(x => $"Server URL must start with {NewServerUrlRequiredPrefix}"), 
      serverUrlEmptyObservable.Select(x => "Server URL cannot be empty")); 

答えて

1

IObservableを1つ作成し、ToPropertyメソッドを使用してErrorHint出力プロパティの値を設定します。これは基本的にこれを「ReactiveUI」の方法で実装する方法です:

public class ReactiveViewModel : ReactiveObject 
{ 
    private const string NewServerUrlRequiredPrefix = "https"; 

    public ReactiveViewModel() 
    { 
     this.WhenAnyValue(x => x.NewServerUrl) 
      .Select(_ => 
      { 
       if (string.IsNullOrEmpty(NewServerUrl)) 
        return "Server URL cannot be empty"; 
       else if (!NewServerUrl.StartsWith(NewServerUrlRequiredPrefix)) 
        return $"Server URL must start with {NewServerUrlRequiredPrefix}"; 

       return string.Empty; 
      }).ToProperty(this, x => x.ErrorHint, out _errorHint); 
    } 

    private string _newServerUrl; 
    public string NewServerUrl 
    { 
     get { return _newServerUrl; } 
     set { this.RaiseAndSetIfChanged(ref _newServerUrl, value); } 
    } 

    private readonly ObservableAsPropertyHelper<string> _errorHint; 
    public string ErrorHint { get { return _errorHint.Value; } } 
} 
0

あなたは、単一のSelect関数の中にそれを置くことによって、すべてのロジックを組み合わせることができます。

ErrorHint = this.WhenAnyValue(x => x.NewServerUrl) 
    .Select(url => 
    { 
     if(string.IsNullOrWhiteSpace(url)) 
     { 
      return "Server URL cannot be empty"; 
     } 
     if(!url.StartsWith(NewServerUrlRequiredPrefix)) 
     { 
      return $"Server URL must start with {NewServerUrlRequiredPrefix}"; 
     } 
     return ""; 
    }) 
    .DistinctUntilChanged(); 

これは、単に適切なエラーメッセージに各NewServerUrl値をマッピングして、唯一のオブザーバーに通知されるエラーメッセージの変更(DistinctUntilChangedを使用)。

関連する問題