我没有经验,特别是在MVVM,但是尝试使用ReactiveUI,而我并不理解我发现的那些演示ReactiveCommand的示例。我曾经使用过一次ICommand / DelegateCommand,但这是不同的,我没有得到它。
我想做的事情非常简单。单击视图中的按钮,然后在视图模型中执行该方法。我发现的所有例子都涉及IObservable<>,但我没有得到,因为他们没有解释那些适合我的总菜鸟。
基本上,我尝试将其用作学习体验,而我理想的做法是将xaml中按钮的Command属性绑定到命令(但是这样可行,我不知道,这导致一个方法执行。没有集合,我只是传递一个int变量。
感谢您的帮助。我真的很感激。
修改 - 使用Paul Betts'建议:
C#
public ReactiveCommand AddToDailyUsed { get; protected set; }
public MainPageVM()
{
Initialize();
AddToDailyUsed = new ReactiveCommand();
AddToDailyUsed.Subscribe(AddToTodayUsedAction => this.AddToDailyUsedExecuted());
}
private object AddToDailyUsedExecuted()
{
MessageBox.Show("AddToDailyUsedAction");
return null;
}
private void AddToDailyUsedAction(object obj)
{
MessageBox.Show("AddToDailyUsedAction");
}
XAML
<Button Content="{Binding Strings.add, Source={StaticResource LocalStrings}}"
Command="{Binding AddToTodayUsed}"
Margin="-5,-10, -10,-10"
Grid.Row="3"
Grid.Column="2" />
显然我错过了一些东西。我在AddToDailyUsedExecuted和AddToDailyUsedAction方法中插入了断点,但它们永远不会到达。
编辑视图后面代码的构造函数:
MainPageVM mainPageVM = new MainPageVM();
public MainPage()
{
InitializeComponent();
Speech.Initialize();
DataContext = mainPageVM;
ApplicationBar = new ApplicationBar();
TaskRegistration.RegisterScheduledTask();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
//Shows the rate reminder message, according to the settings of the RateReminder.
(App.Current as App).rateReminder.Notify();
}
答案 0 :(得分:8)
因此,ReactiveCommand本身就是一个IObservable<object>
- 在这种情况下,您可以将IObservable概念化为一个事件 - 当调用命令时(即按下按钮时)会触发此事件。因此,在构造函数中,您可以编写:
MyCommand = new ReactiveCommand();
MyCommand.Subscribe(param => this.MyCommandHasExecuted());
然而,对于常规事件而言,IObservable的不完整之处在于你可以在它们上面使用LINQ:
// Now, MyCommandHasExecuted only gets run when the UserName isn't null
MyCommand.Where(param => this.UserName != null)
.Subscribe(param => this.MyCommandHasExecuted());
更新:您的Xaml绑定到AddToTodayUsed
,但您的ViewModel命令名为AddToDailyUsed
。可能是吗?