O ", ¿cómo hacer que todas sus fijaciones permanecen correcta?"
(esto es un poco largo, pero tengan paciencia conmigo, he intentado que sea lo más corto que pude)verificación estática de las consolidaciones
Consideremos el siguiente ejemplo:
<TextBox Name="tb" />
<TextBlock Text="{Binding Text.TheProp, ElementName=tb}" />
está perfectamente conocido en tiempo de compilación que la unión es incorrecta (es decir, el analizador sabe el tipo de elemento tb
, y por lo tanto, se conoce el tipo de es 0,propiedad, y por lo tanto, sabe que TheProp
no existe).
Sin embargo, este código se compilará y ejecutará (aunque con un mensaje de error vinculante en la salida de depuración).
Este comportamiento puede ser muy útil en algunas situaciones: no importa de qué tipo exacto sean mis datos, siempre y cuando tenga las propiedades apropiadamente nombradas, estoy bien. Por lo tanto, obtenemos un tipo de "tipa declarativa de pato".
Sin embargo,, tipar pato no siempre es algo bueno.
Específicamente, al usar el patrón MVVM, sé (la mayoría de las veces) los tipos exactos de todos mis objetos de ViewModel. Por otro lado, los modelos se vuelven cada vez más complejos con el tiempo, lo que me preocupa por la futura refactorización: ¿qué ocurre si decido cambiar el nombre de algunas propiedades o, Dios no lo permita, ponerlas en un objeto agregado separado? ¿Qué va a pasar con todas mis ataduras entonces? ¿Tendré que rastrillar todos los archivos XAML a mano? E incluso sin refactorizar, ¿qué pasa si simplemente hago un error tipográfico?
Un problema similar ya está resuelto en otros lugares de XAML. Si, por ejemplo, pone un nombre de propiedad incorrecto en Style/Setter/@Property
, obtendrá un error de tiempo de compilación.
TemplateBinding
también proporciona dicha verificación. Lo cual es muy útil.
Así, idealmente, me gustaría ver algo como esto:
ProductViewModel.cs:
public class ProductViewModel
{
public Name { get; set; }
public Price { get; set; }
}
ProductView.XAML:
<UserControl x:Class="Shopping.View.ProductView"
x:DataContextType="vm:ProductViewModel"
xmlns:vm="clr-namespace:Shopping.ViewModel"
... >
<TextBox Text="{Binding Name}" /> <!-- OK -->
<TextBox Text="{Binding Price}" /> <!-- OK -->
<TextBox Text="{Binding ABC}" /> <!-- Compile time error: there is no property ABC in ProductViewModel -->
</UserControl>
ShoppingCart. XAML:
<UserControl x:Class="Shopping.View.ShoppingCartView"
x:DataContextType="vm:ShoppingCartViewModel"
xmlns:vm="clr-namespace:Shopping.ViewModel"
... >
<ItemsControl ItemsSource="{Binding Products}"
ItemType="vm:ProductViewModel" > <!-- Static check happens here
ShoppingCartViewModel.Products must
implement IEnumerable<ProductViewModel> -->
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ProductViewModel">
<view:ProductView /> <!-- DataContext is known to be of correct type
because of DataTemplate.DataType property -->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</UserControl>
Pero volvamos a la realidad. En realidad, todo ese sueño no va a suceder en el futuro cercano.
Sin embargo, estoy seguro de que no soy la primera persona en tener este problema.
Así que, finalmente, la pregunta es: ¿Cómo se asegura de que sus enlaces sean correctos? ¿Y que permanezcan así?
UWP ahora proporciona enlace estático a través de la extensión de marcado ['{x: Bind}'] (https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup- extensión). Maneras misteriosas :) – Funk