IReactiveBinding не работает с IDataErrorInfo

У меня проблема с использованием IDataErrorInfo в сочетании с IReactiveBinding.Bind(). Я надеюсь, что кто-то здесь может мне помочь.

У меня есть ViewModel, унаследованная от ReactiveObject и реализующая интерфейс IDataErrorInfo.

public class MainWindowViewModel : ReactiveUI.ReactiveObject, IDataErrorInfo    
{

  private string username = string.Empty;

  public string Username
  {
    get { return this.username; }
    set { this.RaiseAndSetIfChanged(ref this.username, value); }
  }


  public MainWindowViewModel()
  {
    this.Validator = new MainWindowViewModelValidator();
  }

  public AbstractValidator<MainWindowViewModel> Validator { get; set; }

#region IDataErrorInfo Members

string IDataErrorInfo.Error
{
    get
    {
        return Validator != null ? string.Join(Environment.NewLine, Validator.Validate(this).Errors.Select(x => x.ErrorMessage).ToArray())
        : string.Empty;
    }
}

string IDataErrorInfo.this[string propertyName]
{
    get
    {
        if (Validator != null)
        {
            var results = Validator.Validate(this, propertyName);
            if (results != null
                && results.Errors.Count() > 0)
            {
                var errors = string.Join(Environment.NewLine, results.Errors.Select(x => x.ErrorMessage).ToArray());
                return errors;
            }
        }
        return string.Empty;
    }
}

        #endregion
}

MainWindowViewValidator гарантирует, что свойство Username не пусто.

ViewModel подключается к View в коде XAML-файла:

public partial class MainWindow : IViewFor<MainWindowViewModel>
{

    public MainWindow()
    {
        InitializeComponent();

        this.ViewModel = new MainWindowViewModel();

        this.Bind(this.ViewModel, viewmodel => viewmodel.Username, view => view.Username.Text);
    }
        public MainWindowViewModel ViewModel
    {
        get { return (MainWindowViewModel)GetValue(ViewModelProperty); }
        set { SetValue(ViewModelProperty, value); }
    }

    public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register("ViewModel", typeof(MainWindowViewModel), typeof(MainWindow), new PropertyMetadata(null));

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (MainWindowViewModel)value; }
    }
}

Проблема теперь в том, что проверка модели не вызывается, так как я не указываю привязку данных напрямую в файле XAML.

У кого-нибудь есть аккуратное решение этой проблемы?


person Rufus Buschart    schedule 19.11.2014    source источник


Ответы (1)


Проблема теперь в том, что проверка модели не вызывается, так как я не указываю привязку данных напрямую в файле XAML.

ReactiveUI не участвует в IDataErrorInfo и друзьях для привязки. Раньше так и было, но на самом деле, если подумать, проверка сама по себе является производным свойством формы.

ReactiveUI уже очень хорошо описывает, как свойства связаны друг с другом (через WhenAny/ToProperty), поэтому вам нужно просто создать свойство ValidationError, которое отображает сообщение об ошибке.

person Ana Betts    schedule 22.11.2014