c# - IReactiveBinding 不适用于 IDataErrorInfo

标签 c# wpf xaml system.reactive reactiveui

我在将 IDataErrorInfo 与 IReactiveBinding.Bind() 结合使用时遇到问题。我希望这里有人能帮助我。

我有一个继承自 ReactiveObject 并实现了 IDataErrorInfo 接口(interface)的 ViewModel。

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 连接到 XAML 文件后面的代码中的 View :

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 文件中指定数据绑定(bind)。

有人有解决这个问题的好方法吗?

最佳答案

The problem is now that the model validation is not called, as I don't specify the databinding in the XAML file directly.

ReactiveUI 不参与 IDataErrorInfo 和 friend 的绑定(bind)。它曾经是,但如果您仔细想想,验证本身就是表单的派生属性

ReactiveUI 已经非常擅长描述属性如何相互关联(通过 WhenAny/ToProperty),因此您应该只构造一个显示错误消息的 ValidationError 属性。

关于c# - IReactiveBinding 不适用于 IDataErrorInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27025326/

相关文章:

c# - 您能否使用 Dapper 来刷新现有的对象引用而不是总是返回新的对象引用?

c# - 最小起订量 + 单元测试 - System.Reflection.TargetParameterCountException : Parameter count mismatch

c# - 将行为附加到 MetroWindow 失败并导致错误的样式

c# - 使用运行时生成的控件保存控件窗口并重新加载为以前的状态

c# - ASP.NET HtmlTextArea 属性和换行符

c# - 在 C# 中使用 Socket api 时 TCP 数据包如何到达

wpf - 如何获取数据网格列绑定(bind)的字段?

silverlight - Silverlight/XAML 中的水平规则

c# - CommandBarButton 图标变得黑色背景

.net - 是否有 WPF XAML 用于统一拟合但恒定的 StrokeThickness