직접 근거
Blazor DI 구성 코드 선언
ControlsEvent와 ControlsViewModel을 각각 Scoped 서비스로 등록합니다.
builder.Services.AddScoped<ControlsEvent>(); builder.Services.AddScoped<ControlsViewModel>();builder.Services.AddScoped<LightBulbModel>();
builder.Services.AddScoped<LightBulbEvent>();
builder.Services.AddScoped<LightBulbViewModel>();
builder.Services.AddScoped<ControlsEvent>();
builder.Services.AddScoped<ControlsViewModel>();
builder.Services.AddScoped<DreamineDialogService>();
var app = builder.Build();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapRazorComponents<App>()
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Blazor/Program.cs:16-28직접 근거
ClickMe 명령 선언 코드 선언
ClickMe 부분 메서드가 `[DreamineCommand("Event.ClickMe")]`로 Event 메서드 경로를 지정합니다.
[DreamineCommand("Event.ClickMe")] private partial void ClickMe(); /// \endif
/// \if EN
/// <para>Performs the click me operation.</para>
/// \endif
/// </summary>
[DreamineCommand("Event.ClickMe")]
private partial void ClickMe();
// ── CheckBox (순수 UI 상태; 커맨드 로직 없음) ───────────
/// <summary>
/// \if KO
/// <para>check1 값을 보관합니다.</para>
/// \endif
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:185-197직접 근거
CommunityToolkit.Mvvm 패키지 버전 코드 선언
저장소가 CommunityToolkit.Mvvm 8.4.2를 중앙 패키지 버전으로 관리합니다.
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" /><Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageVersion Include="Markdig" Version="0.38.0" />
<PackageVersion Include="Microsoft.Playwright" Version="1.51.0" />
<PackageVersion Include="Microsoft.VisualStudio.SDK" Version="17.14.40265" ExcludeAssets="runtime" NoWarn="NU1604" />
<PackageVersion Include="Microsoft.VSSDK.BuildTools" Version="17.14.2120" PrivateAssets="all" NoWarn="NU1604" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.13.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
20_SOURCES/Directory.Packages.props:1-13직접 근거
ControlsEvent 연결 코드 선언
ControlsViewModel이 `[DreamineEvent]` 필드로 ControlsEvent를 선언합니다.
[DreamineEvent] private ControlsEvent _event; /// \endif
/// \if EN
/// <para>Stores the event value.</para>
/// \endif
/// </summary>
[DreamineEvent]
private ControlsEvent _event;
// ── Button ────────────────────────────────────────────
/// <summary>
/// \if KO
/// <para>Click Count 값을 가져옵니다.</para>
/// \endif
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:153-165직접 근거
ControlsEvent의 책임 코드 선언
ControlsEvent가 실제 동작을 처리하고 ControlsViewModel은 DreamineCommand를 통해 메서드를 호출만 한다고 설명합니다.
public sealed class ControlsEvent
namespace SampleCrossUi.Shared.ViewModels;
/// <summary>
/// \if KO
/// <para>Controls 데모의 실제 동작(버튼 클릭/라디오 선택/LED 토글/텍스트 클리어 등)을 처리합니다. ControlsViewModel은 [DreamineCommand]를 통해 이 클래스의 메서드를 호출만 한다.</para>
/// \endif
/// \if EN
/// <para>Encapsulates controls event functionality and related state.</para>
/// \endif
/// </summary>
public sealed class ControlsEvent
{
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsEvent.cs:3-15직접 근거
ControlsViewModel의 기반 형식 코드 선언
Dreamine 속성·인터페이스·ViewModel 네임스페이스를 사용하며 ControlsViewModel이 ViewModelBase를 상속합니다.
public partial class ControlsViewModel : ViewModelBase, IActivatable, IVisibilityAware/// <summary>
/// \if KO
/// <para>Controls View Model 기능과 관련 상태를 캡슐화합니다.</para>
/// \endif
/// \if EN
/// <para>Controls showcase ViewModel. Platform-independent. Reusable across WPF, WinForms, Blazor, and MAUI. Actual behavior lives in <see cref="ControlsEvent"/>; pure UI-only state (no business logic attached) uses [DreamineProperty] directly here.</para>
/// \endif
/// </summary>
public partial class ControlsViewModel : ViewModelBase, IActivatable, IVisibilityAware
{
// ── ViewSwitcher.NotifyShown/NotifyHidden 데모 ──────────
/// <summary>
/// \if KO
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:90-102직접 근거
Dreamine.MVVM.Attributes 비교표 코드 선언
CommunityToolkit.Mvvm은 런타임 로직과 코드 생성 마커를 제공하고, Dreamine.MVVM.Attributes는 선언 계층에 집중한다고 설명합니다.
## 비교
## 비교
| 패키지 | 역할 | 런타임 로직 | 코드 생성 마커 |
|---|---|---:|---:|
| CommunityToolkit.Mvvm | MVVM 툴킷 | Yes | Yes |
| Prism | MVVM 프레임워크 | Yes | No |
| Dreamine.MVVM.Attributes | Attribute 선언 | No | Yes |
Dreamine.MVVM.Attributes는 전체 런타임 프레임워크가 아니라 선언 계층에 집중합니다.
---
20_SOURCES/100. Library/Attributes/README_KO.md:350-362직접 근거
MAUI UI 전용 코드비하인드 사례 코드 선언
버튼 이벤트 처리기에서 DreamineMessageBox를 호출하고 결과를 UI 레이블에 직접 반영합니다.
private async void OnShowMessageBoxClicked(object? sender, EventArgs e) /// \endif
/// </param>
private async void OnShowMessageBoxClicked(object? sender, EventArgs e)
{
var result = await DreamineMessageBox.ShowAsync(
"DreamineMessageBox 데모입니다.\n버튼을 클릭하거나 기다리면 자동으로 닫힙니다.",
"MessageBox Demo",
autoClickDelaySeconds: 5);
ResultLabel.Text = $"Last result: MessageBox → {result}";
}
/// <summary>
/// \if KO
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Maui/Views/PopupPage.xaml.cs:50-62