csharp-wpf-extensions

WpfExtension, utilidades para aplicaciones en WPF

WpfExtensions es una biblioteca para .NET que ofrece algunas herramientas para mejorar el desarrollo de aplicaciones WPF en C#.

Esta biblioteca fue creada por Dingping Zhang y tiene como objetivo simplificar y agilizar el proceso de desarrollo de aplicaciones WPF.

Uno de los puntos fuertes de WPF fue la mejora del bindings respecto a la solución anterior en Winforms. Sin embargo, no puede compararse a soluciones más modernas como VueJS.

Con WpfExtensions el binding es “un poco menos horrible”, gracias a algunas nuevas herramientas que mejoran la sintaxis en los bindings, ahorrándote tiempo y permitiéndote generar código más limpio y sencillo.

Cómo usar WpfExtensions

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package H.InputSimulator

Aquí tenéis algunos de cómo utilizar WpfExtensions extraídos de la documentación de la librería

Command

La extensión de marcado Command nos permite emplear un patrón Command, sin tener que crear realmente el Command (mucho Command para una única frase, ya lo siento).

Así, podemos asociar el Command de un control,

<Element Command={markup:Command Execute} />

Directamente con un método síncrono o asíncrono, sin tener que crear el Command.

class ViewModel
{
    public void Execute() {}
}

Compose

Con Compose podemos concatenar (chain) converters, para crear comportamientos más complejos sin tener que crear un converter específico.

<TextBlock Visibility="{Binding DescriptionText, Converter={markup:Compose
                       {StaticResource IsNullOrEmptyOperator},
                       {StaticResource NotConverter},
                       {StaticResource BooleanToVisibilityConverter}}}"
           Text="{Binding DescriptionText}" />

If

Con la extensión IF podemos bindear condicionalmente una propiedad a dos, en función del valor de un tercer parámetro booleano.

<Button Command="{markup:If {Binding BoolProperty},
                            {Binding OkCommand},
                            {Binding CancelCommand}}" />

Switch

Con esta extensión podemos bindear condicionalmente una propiedad a N, de forma similar a como haríamos con un Switch.

<Image Source="{markup:Switch {Binding FileType},
                              {Case {x:Static res:FileType.Music}, {StaticResource MusicIcon}},
                              {Case {x:Static res:FileType.Video}, {StaticResource VideoIcon}},
                              {Case {x:Static res:FileType.Picture}, {StaticResource PictureIcon}},
                              ...
                              {Case {StaticResource UnknownFileIcon}}}" />

WpfExtensions.Binding

También tiene un mecanismo para mejorar la reactividad de propiedades computadas. Personalmente, estoy acostumbrado a usar Fody o ReactiveUI para lidiar con esto, así que no me resulta tan útil. Pero ahí está, la funcionalidad.

// View Model is derived from WpfExtensions.Binding.BindableBase.
public double Width {
    get => field;
    set => SetProperty(ref field, value);
}

public double Height {
    get => field;
    set => SetProperty(ref field, value);
}

public double RectArea => Computed(() => Width * Height);