下午好,

我正在尝试在 View 模型中触发ICommand ...从 View 模型而不是从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);
   }
}

有任何想法吗??

提前致谢。

EDIT1:我检查了.IsEnabled,并且启用了计时器。但是,TelTimerTick()未运行。

EDIT2:我没有提到KeyDown是从其他线程调用的。这会对事件打到TelTimerTick()产生影响吗?

最佳答案

我不确定是否要遵循,但是是否只想从 View 模型中调用某些命令?

正如MvGarnagle在回答中指出的那样,您每次都在分配一个新命令,执行其操作或:

private ICommand startCommand;
public ICommand StartTCommand
{
   get { return startCommand ?? (startCommand = new RelayCommand(ExeStartTCommand)); }
}

编辑
DispatcherTimer telTimer;//未分配
无效的ExeStartTCommand()
{
//可能为空
如果telTimer!= null && telTimer.IsEnabled)
{
telTimer.Stop();
返回;
}
telTimer =新的DispatcherTimer();
telTimer.Tick + = TelTimerTick;
telTimer.Interval = new TimeSpan(0,0,0,0,10);
telTimer.Start();
}
private void TelTimerTick(object sender, EventArgs e) //Every Tick
{
    Data.Te(Td);
}

在您的 View 模型中,只需直接调用ExeStartTCommand即可,不要触发该命令,无需这样做。
现在,如果这是一个像自定义控件那样的DO,则必须触发命令,以便使用控件的 View 将使用这些命令或更常见的路由事件。

编辑:

现在为代码
// 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,该Dispatcher设置为您要在其上运行的调度程序,并使用该属性而不是上面的属性。如果您正在处理线程问题,那么我需要您提供更多背景信息,请在此处进行黑暗拍摄:)

干杯,

施蒂安

关于c# - ViewModel和DispatcherTimer的RelayCommand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25694618/

10-11 13:57