RelayCommand from ViewModel & DispatchTimer
本文关键字:DispatchTimer amp from ViewModel RelayCommand | 更新日期: 2023-09-27 18:20:46
下午好,
我正试图在视图模型中启动一个ICommand。。。从视图模型,而不是从UI。
该命令在UI-xaml中运行良好,但在这种不同的场景中,它却不能。
private DispatcherTimer telTimer;
public RelayCommand StartT_Command { get { return new RelayCommand(Exe_StartT_Command); } }
void Exe_StartT_Command(object parameter)
{
if (telTimer != null && telTimer.IsEnabled)
{
telTimer.Stop();
return;
}
telTimer = new DispatcherTimer();
telTimer.Tick += new EventHandler(TelTimerTick);
telTimer.Interval = new TimeSpan(0, 0, 0, 0, 10);
telTimer.Start();
}
private void TelTimerTick(object sender, EventArgs e) //Every Tick
{
Data.Te(Td);
}
正如我所说,它从UI运行良好,然而,当被调用时(见下文),它一直通过telTimer.Start()运行;然后。。。没有。
void KeyDown(int vKey)
{
if (vKey == 0x6A) //Num Pad * Key
{
this.StartT_Command.Execute(null);
}
}
有什么想法吗??
提前谢谢。
编辑1:我检查了。IsEnabled,计时器已启用。但是,TelTimerTick()没有运行。
第二版:我没有提到KeyDown是从不同的线程调用的。这会对事件点击TelTimerTick()产生影响吗?
我不太确定我是否遵循了,但如果您只是想从视图模型中调用一些命令?
正如MvGarnagle在他的回答中指出的那样,你每次都在分配一个新的命令,做他做的事,或者:
private ICommand startCommand;
public ICommand StartTCommand
{
get { return startCommand ?? (startCommand = new RelayCommand(ExeStartTCommand)); }
}
编辑DispatcherTimer-telTimer;//未分配void ExeStartTCommand(){//可能为nullif telTimer=空&;telTimer.IsEnabled){telTimer.Stop();回来}telTimer=新的DispatcherTime();telTimer.Tick+=TelTimerTick;telTimer.Interval=新TimeSpan(0,0,0、0、10);telTimer.Start();}
private void TelTimerTick(object sender, EventArgs e) //Every Tick
{
Data.Te(Td);
}
在您的视图模型中,只需直接调用ExeStartTCommand,不必触发该命令。现在,如果这是一个类似于自定义控件的DO,则必须激发命令,以便使用控件的视图将使用这些命令或更常见的路由事件。
编辑:
现在对于代码
// how is this hooked up? W32 wrap?
void KeyDown(int vKey)
{
if (vKey == 0x6A) //Num Pad * Key
// Have the dispatchers in your viewmodelbaseclass, this is just for simplicity
App.Current.Dispatcher.BeginInvoke(new Action(ExeStartTCommand));
}
您的基类中应该有一个Dispatcher,它被设置为您希望它在其上运行的调度器,并使用该属性而不是上面的属性。如果你正在处理线程问题,我需要你提供更多的上下文,有点像在黑暗中拍摄:)
干杯,
Stian