Sample01
1.0.0.0
Sample01 사용 방법을 보여 주는 예제 프로젝트입니다.
Toggle main menu visibility
로딩중...
검색중...
일치하는것 없음
MainWindowViewModel.cs
이 파일의 문서화 페이지로 가기
1
using
Dreamine.Hybrid.Interfaces;
2
using
Dreamine.MVVM.Attributes;
3
using
Dreamine.MVVM.ViewModels;
4
using
Sample01.Messages
;
5
using
Sample01.States
;
6
using
System;
7
using
System.Collections.ObjectModel;
8
using
System.Threading;
9
using
System.Threading.Tasks;
10
using
System.Windows;
11
12
namespace
Sample01.ViewModels
13
{
22
public
sealed
partial class
MainWindowViewModel
: ViewModelBase, IDisposable
23
{
32
private
readonly IHybridMessageBus
_bus
;
41
private
readonly IHybridStateStore<CounterState>
_store
;
50
private
readonly IDisposable?
_dashboardSub
;
59
private
readonly IDisposable?
_counterSub
;
68
private
bool
_disposed
;
69
78
[DreamineProperty]
private
string
_title
=
"🌇 저녁시간이 다가옵니다!"
;
87
[DreamineProperty]
private
int
_clickCount
;
96
[DreamineProperty]
private
string
_statusMessage
=
"대기 중..."
;
105
[DreamineProperty]
private
ObservableCollection<string>
_logs
=
new
();
106
139
public
MainWindowViewModel
(
140
IHybridMessageBus bus,
141
IHybridStateStore<CounterState> store)
142
{
143
_bus
= bus ??
throw
new
ArgumentNullException(nameof(bus));
144
_store
= store ??
throw
new
ArgumentNullException(nameof(store));
145
146
ApplyState
(
_store
.State);
147
148
_dashboardSub
=
_bus
.Subscribe<
DashboardActionRequestedMessage
>(
OnDashboardActionRequestedAsync
);
149
_counterSub
=
_bus
.Subscribe<
CounterChangedMessage
>(
OnCounterChangedAsync
);
150
}
151
160
[DreamineCommand(
"OnClick"
)]
161
private
partial
void
Click
();
162
171
[DreamineCommand(
"OnReset"
)]
172
private
partial
void
Reset
();
173
206
private
Task
OnDashboardActionRequestedAsync
(
207
DashboardActionRequestedMessage
message,
208
CancellationToken cancellationToken)
209
{
210
if
(
_disposed
|| cancellationToken.IsCancellationRequested)
211
{
212
return
Task.CompletedTask;
213
}
214
215
return
RunOnUiAsync
(() =>
216
{
217
Logs.Add($
"[{DateTime.Now:HH:mm:ss}] Dashboard Action: {message.Action}"
);
218
});
219
}
220
253
private
Task
OnCounterChangedAsync
(
254
CounterChangedMessage
message,
255
CancellationToken cancellationToken)
256
{
257
if
(
_disposed
|| cancellationToken.IsCancellationRequested)
258
{
259
return
Task.CompletedTask;
260
}
261
262
return
RunOnUiAsync
(() =>
263
{
264
ClickCount = message.
Count
;
265
StatusMessage = $
"현재 클릭 수: {ClickCount}"
;
266
Logs.Add($
"[{DateTime.Now:HH:mm:ss}] (Blazor) 카운트 변경: {ClickCount}"
);
267
268
_store
.SetState(
new
CounterState
(
269
Count: ClickCount,
270
LastSource:
"Blazor → WPF → StateStore"
,
271
LastUpdated: DateTime.Now));
272
});
273
}
274
283
private
void
OnClick
()
284
{
285
ThrowIfDisposed
();
286
287
ClickCount++;
288
StatusMessage = $
"현재 클릭 수: {ClickCount}"
;
289
Logs.Add($
"[{DateTime.Now:HH:mm:ss}] (WPF) 버튼 클릭 {ClickCount}회"
);
290
291
_store
.SetState(
new
CounterState
(
292
Count: ClickCount,
293
LastSource:
"WPF → StateStore"
,
294
LastUpdated: DateTime.Now));
295
296
_ =
PublishCounterChangedAsync
(ClickCount);
297
}
298
307
private
void
OnReset
()
308
{
309
ThrowIfDisposed
();
310
311
ClickCount = 0;
312
StatusMessage =
"초기화 완료"
;
313
Logs.Clear();
314
315
_store
.SetState(
new
CounterState
(
316
Count: 0,
317
LastSource:
"WPF → StateStore"
,
318
LastUpdated: DateTime.Now));
319
320
_ =
PublishCounterChangedAsync
(ClickCount);
321
}
322
347
private
Task
PublishCounterChangedAsync
(
int
count)
348
{
349
return
_bus
.PublishAsync(
new
CounterChangedMessage
(count));
350
}
351
368
private
void
ApplyState
(
CounterState
state)
369
{
370
ClickCount = state.Count;
371
StatusMessage = $
"현재 클릭 수: {ClickCount}"
;
372
}
373
406
private
static
Task
RunOnUiAsync
(Action action)
407
{
408
if
(action is
null
)
409
{
410
throw
new
ArgumentNullException(nameof(action));
411
}
412
413
Application? application = Application.Current;
414
415
if
(application?.Dispatcher is
null
)
416
{
417
action();
418
return
Task.CompletedTask;
419
}
420
421
if
(application.Dispatcher.CheckAccess())
422
{
423
action();
424
return
Task.CompletedTask;
425
}
426
427
return
application.Dispatcher.InvokeAsync(action).Task;
428
}
429
438
public
void
Dispose
()
439
{
440
if
(
_disposed
)
441
{
442
return
;
443
}
444
445
_counterSub
?.Dispose();
446
_dashboardSub
?.Dispose();
447
448
_disposed
=
true
;
449
GC.SuppressFinalize(
this
);
450
}
451
468
private
void
ThrowIfDisposed
()
469
{
470
if
(
_disposed
)
471
{
472
throw
new
ObjectDisposedException(nameof(
MainWindowViewModel
));
473
}
474
}
475
}
476
}
Sample01.Messages
Definition
CounterChangedMessage.cs:4
Sample01.States
Definition
CounterState.cs:4
Sample01.States.CounterState
record CounterState(int Count, string LastSource, DateTime? LastUpdated)
Sample01.ViewModels
Definition
MainWindowViewModel.cs:13
Sample01.Messages.CounterChangedMessage
Definition
CounterChangedMessage.cs:14
Sample01.Messages.CounterChangedMessage.Count
int Count
Definition
CounterChangedMessage.cs:44
Sample01.Messages.DashboardActionRequestedMessage
Definition
DashboardActionRequestedMessage.cs:14
Sample01.ViewModels.MainWindowViewModel._counterSub
readonly? IDisposable _counterSub
Definition
MainWindowViewModel.cs:59
Sample01.ViewModels.MainWindowViewModel._statusMessage
string _statusMessage
Definition
MainWindowViewModel.cs:96
Sample01.ViewModels.MainWindowViewModel.PublishCounterChangedAsync
Task PublishCounterChangedAsync(int count)
Definition
MainWindowViewModel.cs:347
Sample01.ViewModels.MainWindowViewModel.RunOnUiAsync
static Task RunOnUiAsync(Action action)
Definition
MainWindowViewModel.cs:406
Sample01.ViewModels.MainWindowViewModel._dashboardSub
readonly? IDisposable _dashboardSub
Definition
MainWindowViewModel.cs:50
Sample01.ViewModels.MainWindowViewModel.OnReset
void OnReset()
Definition
MainWindowViewModel.cs:307
Sample01.ViewModels.MainWindowViewModel.OnClick
void OnClick()
Definition
MainWindowViewModel.cs:283
Sample01.ViewModels.MainWindowViewModel.ThrowIfDisposed
void ThrowIfDisposed()
Definition
MainWindowViewModel.cs:468
Sample01.ViewModels.MainWindowViewModel.OnCounterChangedAsync
Task OnCounterChangedAsync(CounterChangedMessage message, CancellationToken cancellationToken)
Definition
MainWindowViewModel.cs:253
Sample01.ViewModels.MainWindowViewModel.ApplyState
void ApplyState(CounterState state)
Definition
MainWindowViewModel.cs:368
Sample01.ViewModels.MainWindowViewModel._title
string _title
Definition
MainWindowViewModel.cs:78
Sample01.ViewModels.MainWindowViewModel._logs
ObservableCollection< string > _logs
Definition
MainWindowViewModel.cs:105
Sample01.ViewModels.MainWindowViewModel._disposed
bool _disposed
Definition
MainWindowViewModel.cs:68
Sample01.ViewModels.MainWindowViewModel.MainWindowViewModel
MainWindowViewModel(IHybridMessageBus bus, IHybridStateStore< CounterState > store)
Definition
MainWindowViewModel.cs:139
Sample01.ViewModels.MainWindowViewModel._store
readonly IHybridStateStore< CounterState > _store
Definition
MainWindowViewModel.cs:41
Sample01.ViewModels.MainWindowViewModel._clickCount
int _clickCount
Definition
MainWindowViewModel.cs:87
Sample01.ViewModels.MainWindowViewModel.Click
partial void Click()
Sample01.ViewModels.MainWindowViewModel._bus
readonly IHybridMessageBus _bus
Definition
MainWindowViewModel.cs:32
Sample01.ViewModels.MainWindowViewModel.OnDashboardActionRequestedAsync
Task OnDashboardActionRequestedAsync(DashboardActionRequestedMessage message, CancellationToken cancellationToken)
Definition
MainWindowViewModel.cs:206
Sample01.ViewModels.MainWindowViewModel.Dispose
void Dispose()
Definition
MainWindowViewModel.cs:438
Sample01.ViewModels.MainWindowViewModel.Reset
partial void Reset()
ViewModels
MainWindowViewModel.cs
다음에 의해 생성됨 :
1.17.0