記事ディレクトリ
序文
CommunityToolkit.Mvvm (以下、Toolkit と呼びます) は、WPF の 2 つの最も有名なフレームワークです。1 つは Prism、もう 1 つは Toolkit です。
Prism は私の Prism の詳細な説明を見ることができます
ツールキット
CommunityToolkit.Mvvm で MVVM 開発プロセスを加速する
Nuget のインストール
使いやすい
Toolkit は、よく使用される 2 つのメソッド (
1 つは SetProperty、もう 1 つは RelayCommand)を単純に書き換えるだけです。
SetProperty、更新を通知
public class MainViewModel:ObservableObject
{
private string _title;
public string Title
{
get => _title;
set => SetProperty(ref _title,value);
}
}
本当にコマンド
public RelayCommand ButtonClickCommand {
get; set; }
public MainViewModel()
{
ButtonClickCommand = new RelayCommand(() => {
Debug.WriteLine("Hello World!"); });
}
MVVMモードの3つのコマンドまとめ【2】-RelayCommand
RealyCommand には主に CanExecute プロパティがあります。通知がクリック可能かどうか
実行可能
通知ボタンがクリックできるかどうか(ちょっと味気ない気がします)
public class MainViewModel:ObservableObject
{
private string _title = "Hello world!";
public string Title
{
get => _title;
set => SetProperty(ref _title,value);
}
private bool _isEnable = false;
public bool IsEnable
{
get=> _isEnable;
set
{
SetProperty(ref _isEnable,value);
ButtonClickCommand.NotifyCanExecuteChanged();
}
}
public RelayCommand ButtonClickCommand {
get; set; }
public MainViewModel()
{
ButtonClickCommand = new RelayCommand(() => {
Title = "Value is changed"; },()=>IsEnable);
}
}
<Window.DataContext>
<viewModel:MainViewModel />
</Window.DataContext>
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" >
<TextBox Text="{Binding Title}" Width="200"/>
<CheckBox Content="Is Enable" IsChecked="{Binding IsEnable}" />
<Separator Margin="5"/>
<Button Command="{Binding ButtonClickCommand}" Content="Click Me"/>
</StackPanel>
</Grid>
新機能、コードジェネレーター
Toolkit には、コードを自動的に完成させるジェネレーター関数が追加されました。
ObservableProperty
生成された Public 属性は次の特性に準拠します。
- プライベート
- 名前=>名前
- _name=>名前
- m_name=>名前
上記 3 つは自動的に公開名に対応します。
NotifyCanExecuteChangedFor
以前にパブリックでの get set を通じて通知するように RelayCommand の CanExecute を変更したため、NotifyCanExecuteChangedFor を使用して通知できるようになりました。
[NotifyCanExecuteChangedFor(nameof(ButtonClickCommand))]
[ObservableProperty]
private bool _isEnable = false;
//等价于
private bool _isEnable = false;
public bool IsEnable
{
get=> _isEnable;
set
{
SetProperty(ref _isEnable,value);
ButtonClickCommand.NotifyCanExecuteChanged();
}
}
リレーコマンド
RelayCommand は、対応するコマンドを自動的に生成し、コマンドを初期化する Void 関数を提供します。
[RelayCommand]
public void ButtonClick()
{
}
//等价于
public RelayCommand ButtonClickCommand {
get; set; }
public MainViewModel()
{
ButtonClickCommand = new RelayCommand(() => {
Title = "Value is changed"; }, () => IsEnable);
}
その他の機能
//将CanExecute绑定到IsEnable
[RelayCommand(CanExecute =nameof(IsEnable))]
public void ButtonClick()
{
}
///异步函数也可以,CanExecute会在异步函数结束之后变回去
[RelayCommand(CanExecute =nameof(IsEnable))]
public async Task ButtonClickAsync()
{
await Task.Delay(1000);
Title = "我被修改了";
}
非同期関数のデモ: ボタンの色に注目してください
対応
ButtonClickAsync、ButtonClick=>ButtonClickCommand
プロパティ変更の通知
Title と TestStr が強く関連付けられるなど、2 つの属性が強く関連付けられることを期待します。
Title が TestStr に変更を通知するなど、別のプロパティが変更されたことを通知できるようにしたいと考えています。
private string testStr = $"Title:{
Title}";
ただし、このように書くとエラーが報告されます。設定できるのは静的メソッドのみで、
NotifyPropertyChangedFor を通じて通知できます。
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(TestStr))]
private string _title = "Hello world!";
public string TestStr => $"Title:{
Title}";