Directorio de artículos
prefacio
CommunityToolkit.Mvvm (en lo sucesivo, Toolkit) son los dos marcos más famosos de WPF, uno es Prism y el otro es Toolkit.
Prism puede ver mi explicación detallada de Prism.
Kit de herramientas
Documentación oficial del kit de herramientas
Acelere el proceso de desarrollo de MVVM con CommunityToolkit.Mvvm
instalación nuget
fácil de usar
Toolkit simplemente reescribe nuestros dos métodos de uso común,
uno es SetProperty y el otro es RelayCommand.
SetProperty, notificar actualización
public class MainViewModel:ObservableObject
{
private string _title;
public string Title
{
get => _title;
set => SetProperty(ref _title,value);
}
}
Comando Real
public RelayCommand ButtonClickCommand {
get; set; }
public MainViewModel()
{
ButtonClickCommand = new RelayCommand(() => {
Debug.WriteLine("Hello World!"); });
}
Resumen de 3 comandos del modo MVVM [2] -RelayCommand
RealyCommand tiene principalmente una propiedad CanExecute. Si se puede hacer clic en la notificación
Puede ejecutar
Si se puede hacer clic en el botón de notificación (me siento un poco de mal gusto)
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>
nuevas funciones, generador de código
Toolkit ha agregado una función de generador, que completa automáticamente el código por nosotros.
Propiedad observable
El atributo Público generado cumple con las siguientes características
- privado
- nombre=>Nombre
- _nombre=>Nombre
- m_name=>Nombre
Los tres anteriores corresponderán automáticamente al Nombre público.
NotificarCanExecuteChangedFor
Debido a que previamente modificamos CanExecute de RelayCommand para notificar mediante get set en público, ahora podemos usar NotifyCanExecuteChangedFor para notificar
[NotifyCanExecuteChangedFor(nameof(ButtonClickCommand))]
[ObservableProperty]
private bool _isEnable = false;
//等价于
private bool _isEnable = false;
public bool IsEnable
{
get=> _isEnable;
set
{
SetProperty(ref _isEnable,value);
ButtonClickCommand.NotifyCanExecuteChanged();
}
}
Comando de retransmisión
RelayCommand proporciona una función de anulación, que generará automáticamente un comando correspondiente e inicializará el comando.
[RelayCommand]
public void ButtonClick()
{
}
//等价于
public RelayCommand ButtonClickCommand {
get; set; }
public MainViewModel()
{
ButtonClickCommand = new RelayCommand(() => {
Title = "Value is changed"; }, () => IsEnable);
}
Otras funciones
//将CanExecute绑定到IsEnable
[RelayCommand(CanExecute =nameof(IsEnable))]
public void ButtonClick()
{
}
///异步函数也可以,CanExecute会在异步函数结束之后变回去
[RelayCommand(CanExecute =nameof(IsEnable))]
public async Task ButtonClickAsync()
{
await Task.Delay(1000);
Title = "我被修改了";
}
Demostración de función asincrónica: preste atención al color del botón
Correspondencia
ButtonClickAsync、ButtonClick=>ButtonClickCommand
Notificar propiedad cambiada para
Esperamos que dos atributos estén fuertemente asociados, como Título y TestStr que estén fuertemente asociados.
Queremos poder notificar que otra propiedad ha cambiado, como Título notifica a TestStr de los cambios.
private string testStr = $"Title:{
Title}";
Pero escribir así informará un error, solo se pueden configurar métodos estáticos
y luego podemos notificar a través de NotifyPropertyChangedFor.
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(TestStr))]
private string _title = "Hello world!";
public string TestStr => $"Title:{
Title}";