Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для imcavs™
-2 / 24 / 8
Регистрация: 19.02.2012
Сообщений: 446

WPF MVVM отключить/включить кнопку по таймеру

30.04.2019, 21:04. Показов 2311. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        private DelegateCommand _selectDirCommand;
        public ICommand SelectDirCommand
        {
            get
            {
                return _selectDirCommand ?? (_selectDirCommand = new DelegateCommand(запуск_таймера));
            }
        }
 
 
        private void запуск_таймера()
        {
            DispatcherTimer TimerOne = new DispatcherTimer();
            TimerOne.Interval = new TimeSpan(0, 0, 5);
            TimerOne.Tick += new EventHandler(TimerOneTick);
            TimerOne.Start();
        }
 
        private void TimerOneTick(object sender, EventArgs e)
        {
          
        }
Часть кода ViewModel.
Как отключить кнопку, например на 10 секунд через MVVM?
Верно ли я расположил таймер в слое ViewModel?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2019, 21:04
Ответы с готовыми решениями:

Отключить и включить кнопку
void Awake() {if (gameObject.name=="button1") {отключаем кнопку}} void Method() {if (условие) {включаем кнопку} ...

Можно ли отключить и включить OnDrawColumnCell через кнопку?
Привет всем! Новобранец! Можно ли отключить и включить OnDrawColumnCell через кнопку?

WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Для использования и создания WPF команд в Net предусмотрен...

2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16132 / 11256 / 2888
Регистрация: 21.04.2018
Сообщений: 33,092
Записей в блоге: 2
30.04.2019, 22:48
Цитата Сообщение от imcavs™ Посмотреть сообщение
Как отключить кнопку, например на 10 секунд через MVVM?
Это зависит от реализации ICommand.
Вы применяете DelegateCommand я не знаю что это за класс, ни когда не работал с ним и как это через него делается без понятия.

Если взять реализацию RelayCommand из WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
То можно в таймере менять какой-то флаг к которому привязан метод CanExecute. И после изменения флага вызывать метод Invalidate команды. Это аналог PropertyChanged для свойств.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
30.04.2019, 23:45
Вот пример с использованием библиотеки MvvmLight (писать все эти классы с нуля так себе затея, если только для самообучения).

Скачав проект в нём нужно восстановить NuGet пакеты. Можно сделать нажав правую кнопку мыши на названии решения (Solution) и выбрать соответствующий пункт.

Класс DelayedSwitch однопоточный (TurnOn и TurnOff нужно вызывать из одного потока).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Windows.Threading;
 
namespace DisableButtonApp.Utils
{
    public class DelayedSwitch
    {
        private readonly DispatcherTimer _timer = new DispatcherTimer();
        private SwitcherState _currentState;
 
        public DelayedSwitch(TimeSpan delay)
        {
            Delay = delay;
            _timer.Interval = delay;
            _timer.Tick += Tick;
        }
 
        public event Action<bool> Switched;
        public event Action<SwitcherState> StateChanged;
 
        public SwitcherState State
        {
            get { return _currentState; }
        }
 
        public TimeSpan Delay { get; }
 
        private void Tick(object sender, EventArgs e)
        {
            _timer.Stop();
 
            switch (_currentState)
            {
                case SwitcherState.TurningOn:
                    _currentState = SwitcherState.TurnedOn;
                    OnStateChanged();
                    break;
 
                case SwitcherState.TurningOff:
                    _currentState = SwitcherState.TurnedOff;
                    OnStateChanged();
                    break;
 
                default:
                    throw new ArgumentOutOfRangeException();
            }
 
            OnSwitched(_currentState == SwitcherState.TurnedOn);
        }
 
        public void TurnOff()
        {
            Switch(false);
        }
 
        public void TurnOn()
        {
            Switch(true);
        }
 
        private void Switch(bool turnOn)
        {
            switch (_currentState)
            {
                case SwitcherState.TurnedOn:
                    if (turnOn)
                    {
                        return;
                    }
                    _currentState = SwitcherState.TurningOff;
                    break;
 
                case SwitcherState.TurnedOff:
                    if (!turnOn)
                    {
                        return;
                    }
                    _currentState = SwitcherState.TurningOn;
                    break;
 
                case SwitcherState.TurningOn:
                    if (!turnOn)
                    {
                        _currentState = SwitcherState.TurningOff;
                    }
                    break;
 
                case SwitcherState.TurningOff:
                    if (turnOn)
                    {
                        _currentState = SwitcherState.TurningOn;
                    }
                    break;
 
                default:
                    throw new ArgumentOutOfRangeException();
            }
 
            _timer.Stop();
 
            OnStateChanged();
 
            _timer.Start();
        }
 
        private void OnSwitched(bool turnOn)
        {
            Switched?.Invoke(turnOn);
        }
        
        protected void OnStateChanged()
        {
            StateChanged?.Invoke(_currentState);
        }
    }
 
    public enum SwitcherState
    {
        TurnedOff,
        TurnedOn,
        TurningOff,
        TurningOn
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<Window
    x:Class="DisableButtonApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:DisableButtonApp"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
    mc:Ignorable="d">
    <Grid>
 
        <StackPanel
            Margin="43,90,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Orientation="Vertical">
 
            <Button
                Width="75"
                Margin="0,0,0,6"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Command="{Binding TurnOnCommand}"
                Content="Включить" />
 
            <Button
                Width="75"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Command="{Binding TurnOffCommand}"
                Content="Выключить" />
 
        </StackPanel>
 
        <StackPanel
            Margin="43,31,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Orientation="Vertical">
 
            <TextBlock Text="Состояние переключателя" TextWrapping="Wrap" />
 
            <TextBlock Text="{Binding SwitcherState, Mode=OneWay}" TextWrapping="Wrap" />
 
        </StackPanel>
        <Button
            Margin="219,43,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Command="{Binding TargetCommand}"
            Content="Целевая кнопка" />
        <!--  IsEnabled="{Binding IsTurnedOn, Mode=OneWay}"  -->
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using DisableButtonApp.Utils;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
 
namespace DisableButtonApp.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        private readonly DelayedSwitch _switch;
        private SwitcherState _switcherState;
        private bool _isTurnedOn;
 
        public RelayCommand TurnOnCommand { get; }
 
        public RelayCommand TurnOffCommand { get; }
 
        public RelayCommand TargetCommand { get; }
 
        public SwitcherState SwitcherState
        {
            get { return _switcherState; }
            set { Set(ref _switcherState, value); }
        }
 
        public bool IsTurnedOn
        {
            get { return _isTurnedOn; }
            set { Set(ref _isTurnedOn, value); }
        }
 
        public MainViewModel()
        {
            _switch = new DelayedSwitch(TimeSpan.FromSeconds(3));
            _switch.StateChanged += OnSwitchStateChanged;
            _switch.Switched += OnSwitchSwitched;
 
            TurnOnCommand = new RelayCommand(TurnOn);
            TurnOffCommand = new RelayCommand(TurnOff);
            TargetCommand = new RelayCommand(() => { }, () => _switch.State == SwitcherState.TurnedOn);
 
            TargetCommand.RaiseCanExecuteChanged();
        }
 
        private void OnSwitchSwitched(bool turnOn)
        {
            TargetCommand.RaiseCanExecuteChanged();
            IsTurnedOn = turnOn;
        }
 
        private void OnSwitchStateChanged(SwitcherState newState)
        {
            SwitcherState = newState;
        }
 
        private void TurnOff()
        {
            _switch.TurnOff();
        }
 
        private void TurnOn()
        {
            _switch.TurnOn();
        }
    }
}
Вложения
Тип файла: zip DisableButtonApp.zip (226.2 Кб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.04.2019, 23:45
Помогаю со студенческими работами здесь

WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html На практике часто встречаются случаи когда команда и кнопка...

WPF MVVM
Привет всем! Изучаю патерн MVVM. Не могу понять как реализовать ее, если допустим мне необходимо одно и тоже окно использовать для разных ...

Отключить загрузку страниц в WebBrowser по таймеру
Проверяю страницы в цикле при помощи WebBrowser1 иногда загрузка не происходит. Как отключить по таймеру WebBrowser1 ? ' Загружаем...

WPF MVVM: чистота
Не претендую на истину, пишу скорее с целью выслушать критику и варианты. В идеале реализация MVVM для WPF мне видится следующим...

Актуальный MVVM WPF
Подскажите плиз. Какой на сегодня актуальный фреймворк ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru