Ric*_*ins 5 mvvm windows-phone reactiveui windows-phone-8
我没经验,特别是在MVVM,但尝试使用ReactiveUI,我不理解我发现的演示ReactiveCommand的示例.我曾经使用过一次ICommand/DelegateCommand,但这是不同的,我没有得到它.
我想做的事情非常简单.单击视图中的按钮,然后在视图模型中执行该方法.我发现的所有例子都涉及IObservable <>,我不明白,因为它们没有针对我的总noob的解释.
基本上,我正在尝试将其用作学习体验,而我理想的做法是将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");
}
Run Code Online (Sandbox Code Playgroud)
XAML
<Button Content="{Binding Strings.add, Source={StaticResource LocalStrings}}"
Command="{Binding AddToTodayUsed}"
Margin="-5,-10, -10,-10"
Grid.Row="3"
Grid.Column="2" />
Run Code Online (Sandbox Code Playgroud)
显然我错过了一些东西.我在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();
}
Run Code Online (Sandbox Code Playgroud)
因此,ReactiveCommand本身就是一个IObservable<object>- 在这种情况下,您可以将IObservable概念化为一个事件 - 当调用命令时(即按下按钮时)会触发此事件.所以,在你的构造函数中,你可能会写:
MyCommand = new ReactiveCommand();
MyCommand.Subscribe(param => this.MyCommandHasExecuted());
Run Code Online (Sandbox Code Playgroud)
但是,关于IObservable的常规事件不正确的是,你可以在它们上使用LINQ:
// Now, MyCommandHasExecuted only gets run when the UserName isn't null
MyCommand.Where(param => this.UserName != null)
.Subscribe(param => this.MyCommandHasExecuted());
Run Code Online (Sandbox Code Playgroud)
更新:您的Xaml绑定到AddToTodayUsed但您的ViewModel命令被调用AddToDailyUsed.可能是吗?
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |