2015-08-10 6 views
0

Я создаю пользовательский элемент управления, который использует таймер для подсчета времени и, наконец, запускает действие команды в модели представления.System.Timers.Timer Истекшая команда excute не работает с RelayCommand

Проблема

Когда время прошло, это запустить истекшее событие, а затем выполнить статическую команду.

Дело в том, что когда я нажимаю кнопку обновления, он может вводить 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 
    } 
} 
+0

Не имеет смысла заставить 'MainViewModel' отвечать за создание таймера и отвечать на срабатывание таймера? –

+0

Я знаю, что это возможно, но моя цель - создать usercontrol ... – daniel

ответ

0

Ваш таймер, вероятно, собранный мусор. Попытайтесь сохранить ссылку на нее в своем контроле и проверить, работает ли она.

Кстати, вы можете использовать диспетчерский таймер и не использовать диспетчер самостоятельно.

+0

Нет, это не сбор мусора, он может войти в прошлое. Проблема заключается в том, что RefreshCommand_Executed в режиме просмотра не запущен. И я пытаюсь DispatcherTimer не может решить проблему ... – daniel

+0

@ user1179915 Хорошо, поэтому я неправильно понял проблему. Поэтому, если я правильно понимаю: - когда вы нажимаете на кнопку, вызывается ExecuteCommand_Executed, команда не является нулевой и выполняется - когда таймер истек, выполняется lambda, выполняется действие BeginInvoke, но ExecuteCommand.Execute - никогда не звонил. Правильно? Кстати, зачем вам статическую команду? Вы не можете сделать это DependencyProperty вашего контроля? – sroll

+0

Да, почти все ваше понимание правильное, за исключением того, что, когда истек таймер, выполняется лямбда, выполняется действие BeginInvoke, вызывается ExecuteCommand.Execute, но RefreshCommand_Executed никогда не вызывает вызов, который можно щелкнуть мышью. Я использую статическую команду, потому что это моя привычка XP, но если действительно нужна причина, я могу использовать RelayCommandBinding, чтобы любая из моделей представления обрабатывала выполнение. DependencyProperty требует привязки, поэтому только модель представления представления содержит этот обработчик usercontrol. Хотя я могу это сделать для DP, но я думаю, что статический для DP будет исправлять мою проблему, не так ли? – daniel