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" />
)
问题是:
- 如何使用 ReactiveUI 将标签的文本绑定到 MotorAxis 控件的 属性?
- 如何将值传递给 ViewModel
在构造函数中,它的值始终是默认值 (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。传递了以下参数:
- 视图模型
- 指向视图模型属性的表达式
- 指向视图属性 的表达式
- 一种转换器方法,在视图模型上采用 属性,转换为字符串并将其放在视图上
- 一种转换器方法,在视图中获取字符串并转换为视图模型中的枚举。
有关详细信息,请参阅 https://reactiveui.net/docs/handbook/data-binding/。
我第一次开始使用 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" />
)
问题是:
- 如何使用 ReactiveUI 将标签的文本绑定到 MotorAxis 控件的 属性?
- 如何将值传递给 ViewModel
在构造函数中,它的值始终是默认值 (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。传递了以下参数:
- 视图模型
- 指向视图模型属性的表达式
- 指向视图属性 的表达式
- 一种转换器方法,在视图模型上采用 属性,转换为字符串并将其放在视图上
- 一种转换器方法,在视图中获取字符串并转换为视图模型中的枚举。
有关详细信息,请参阅 https://reactiveui.net/docs/handbook/data-binding/。