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()产生影响吗?

RelayCommand from ViewModel & DispatchTimer

我不太确定我是否遵循了,但如果您只是想从视图模型中调用一些命令?

正如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