ReactiveUI 与 dependencyproperty 绑定并传递给 viewmodel

ReactiveUI binding with dependencyproperty and pass to viewmodel

我第一次开始使用 ReactiveUI(使用 WPF),遇到了一些我无法 google 解决或无法在文档中找到的问题。如何从 Control 的 DependencyProperty 绑定属性?

我正在创建用户控件

public partial class MotorControlView: ReactiveUserControl<MotorControlViewModel>

在 class 里面我有依赖项 属性 MotorAxis

public static readonly DependencyProperty MotorAxisProperty = DependencyProperty.Register(
    "MotorAxis", typeof(MotorAxis), typeof(MotorControlView));

public MotorAxis MotorAxis
{
    get => (MotorAxis) GetValue(MotorAxisProperty);
    set => SetValue(MotorAxisProperty, value);
}

在视图中有一个 TextBlock,它应该显示 MotorAxis(它是一个枚举)字符串值 (NoVal/X/Y/Z)。 属性 设置在 MainWindow.XAML ( <uc:MotorControlView MotorAxis="Y" /> )

问题是:

在构造函数中,它的值始终是默认值 (NoVal),所以我想我不能将它传递给 viewmodel 构造函数...

ViewModel 将负责根据此参数访问X/Y/Z 电机


我找到的唯一解决办法是这样做:

//In View:
public MotorControlView()
{
    InitializeComponent();
    ViewModel = new MotorControlViewModel();
    this.WhenActivated(dr =>
    {
        ViewModel.MotorAxis = this.MotorAxis;
    });
    this.Bind(ViewModel, vm => vm.MotorAxis, v => v.MotorAxisBlock.Text);
}

//在虚拟机中: 属性 与 this.RaiseAndSetIfChanged(ref this.motorAxis, value)

有没有更优雅的方法来做到这一点而无需在 WhenActivated 中手动设置值?所以我将在例如中访问这个值。 VM的构造函数?

Reactiveui 使用代码隐藏绑定。

通常您会将它们放在构造函数中。

reactui 方式的主要优点是类型安全。

public MotorControlView
{
  this.Bind(this.ViewModel, viewModel => viewModel.Axis, view => view.MotorControl.Text, axis => axis.ToString(), axisString => (MotorAxis)Enum.Parse(typeof(MotorAxis), axisString);
}

以上是在构造函数中做Bind。传递了以下参数:

  1. 视图模型
  2. 指向视图模型属性的表达式
  3. 指向视图属性 的表达式
  4. 一种转换器方法,在视图模型上采用 属性,转换为字符串并将其放在视图上
  5. 一种转换器方法,在视图中获取字符串并转换为视图模型中的枚举。

有关详细信息,请参阅 https://reactiveui.net/docs/handbook/data-binding/