下午好,
我正在尝试在 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/