System.Timers.Timer Elapsed excute命令不适用于RelayCommand

时间:2015-08-10 08:52:48

标签: c# .net mvvm relaycommand system.timers.timer

我正在创建一个自定义用户控件,它使用计时器来计算时间并最终在视图模型中运行命令操作。

问题

当时间过去后,它会运行elapsed事件,然后执行静态命令。

事实是,当我点击刷新按钮时,它可以进入RefreshCommand_Executed(它是预期的)。但是,即使然后运行BeginInvoke中的代码(它是意外的),它也无法为定时器弹出的事件输入此函数...

请为此提供帮助。

代码

-CustomControl.xaml.cs

public partial class CustomControl : UserControl
{
    public static ICommand ExecuteCommand = new RoutedCommand();

    public CustomControl()
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.AutoReset = true;
        timer.Interval = 60000.0;
        timer.Elapsed += (sender, e) =>
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
                {
                    if (ExecuteCommand != null)
                    {
                        ExecuteCommand.Execute(sender);
                     }
                }));
        };
        timer.Start();
    }

    private void ExecuteCommand_Executed(object sender, RoutedEventArgs e)
    {
        if (ExecuteCommand != null)
        {
            ExecuteCommand.Execute(sender);
        }
    }
}

-CustomControl.xaml

<UserControl ...skip...>
    <Grid>
        <Button x:Name="refreshButton"
                Content="Refresh"
                Click="ExecuteCommand_Executed" />
    </Grid>
</UserControl>

-MainView.xaml

<UserControl ...skip...>
    <UserControl.Resources>
        <vm:MainViewModel x:Key="ViewModel" />
    </UserControl.Resources>
    <Grid cmd:RelayCommandBinding.ViewModel="{StaticResource ViewModel}">
        <cmd:RelayCommandBinding Command="ctr:CustomControl.ExecuteCommand" CommandName="RefreshCommand" />
    </Grid>
</UserControl>

-MainViewModel.cs

public class MainViewModel : NotifyPropertyChanged
{
    private ICommand refreshCommand;
    public ICommand RefreshCommand
    {
        get { return refreshCommand; }
        set { if (value != refreshCommand) { refreshCommand = value; RaisePropertyChanged("RefreshCommand"); } }
    }

    public MainViewModel()
    {
        RefreshCommand = new RelayCommand(RefreshCommand_Executed);
    }

    void RefreshCommand_Executed(object o)
    {
        //code to run
    }
}

1 个答案:

答案 0 :(得分:0)

你的计时器可能是垃圾收集的。尝试在控件中保留它的引用,并检查它是否有效。

顺便说一句,您可以使用Dispatcher Timer并避免自己使用调度程序。