Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FORMS
El enlace de datos automatiza este trabajo y hace que los controladores de
eventos sean innecesarios. Los enlaces de datos se pueden implementar en
código o en XAML, pero son mucho más comunes en XAML, donde
ayudan a reducir el tamaño del archivo de código subyacente. Al
reemplazar el código de procedimiento en los controladores de eventos con
código declarativo o marcado, la aplicación se simplifica y aclara.
ENLACES BASICOS:
1
Sin embargo, al definir enlaces de datos en XAML, hay varias maneras de
establecer el BindingContext del objeto de destino. A veces se establece
desde el archivo de código subyacente, a veces mediante
una StaticResource extensión de marcado o x:Static y, a veces, como
contenido de etiquetas de elemento de BindingContext propiedad.
Los enlaces se usan con más frecuencia para conectar los objetos visuales
de un programa con un modelo de datos subyacente, normalmente en una
realización de la arquitectura de la aplicación MVVM (Model-View-
ViewModel)
<StackLayout>
<Label Text="ROTATION"
BindingContext="{x:Reference Name=slider}"
Rotation="{Binding Path=Value}"
FontAttributes="Bold"
FontSize="Large"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Slider x:Name="slider"
Maximum="360"
VerticalOptions="CenterAndExpand" />
2
MODO DE ENCUADERNACION:
Una sola vista puede tener enlaces de datos en varias de sus propiedades.
Sin embargo, cada vista solo puede tener un BindingContext, por lo que
varios enlaces de datos en esa vista deben hacer referencia a todas las
propiedades del mismo objeto.
La solución a este y otros problemas implica la Mode propiedad, que se
establece en un miembro de la BindingMode enumeración:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.SliderTransformsPage"
Padding="5"
Title="Slider Transforms Page">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
3
Grid.Row="1" Grid.Column="0"
Maximum="10"
Value="{Binding Scale, Mode=TwoWay}" />
4
FORMATO DE CADENA:
La propiedad StringFormat
Esta función se traslada a los enlaces de datos: establece
la StringFormatpropiedad de Binding(o la StringFormatpropiedad de
la Bindingextensión de marcado) en una cadena de formato .NET estándar
con un marcador de posición:
5
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard"
x:Class="DataBindingDemos.StringFormattingPage"
Title="String Formatting">
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="Label">
<Setter Property="HorizontalTextAlignment" Value="Center" />
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="Blue" />
<Setter Property="HeightRequest" Value="2" />
<Setter Property="Margin" Value="0, 5" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout Margin="10">
<Slider x:Name="slider" />
<Label Text="{Binding Source={x:Reference slider},
Path=Value,
StringFormat='The slider value is {0:F2}'}" />
<BoxView />
<TimePicker x:Name="timePicker" />
<Label Text="{Binding Source={x:Reference timePicker},
Path=Time,
StringFormat='The TimeSpan is {0:c}'}" />
<BoxView />
<Entry x:Name="entry" />
<Label Text="{Binding Source={x:Reference entry},
Path=Text,
StringFormat='The Entry text is "{0}"'}" />
<BoxView />
<StackLayout BindingContext="{x:Static sys:DateTime.Now}">
<Label Text="{Binding}" />
<Label Text="{Binding Path=Ticks,
StringFormat='{0:N0} ticks since 1/1/1'}" />
<Label Text="{Binding StringFormat='The {{0:MMMM}} specifier produces
{0:MMMM}'}" />
<Label Text="{Binding StringFormat='The long date is {0:D}'}" />
</StackLayout>
<BoxView />
<StackLayout BindingContext="{x:Static sys:Math.PI}">
<Label Text="{Binding}" />
<Label Text="{Binding StringFormat='PI to 4 decimal points = {0:F4}'}" />
<Label Text="{Binding StringFormat='PI in scientific notation = {0:E7}'}" />
</StackLayout>
</StackLayout>
</ContentPage>
6
RUTA VINCULANTE:
7
<Label Text="{Binding Source={x:Reference page},
Path=Content.Children.Count,
StringFormat='There are {0} children in this StackLayout'}" />
LA INTERFAZ IVALUECONVERTER
8
Suponga que desea definir un enlace de datos donde la propiedad de
origen es de tipo int pero la propiedad de destino es un
archivo bool. Desea que este enlace de datos produzca un false valor
cuando el origen del número entero sea igual a 0, y true en caso
contrario.
public class IntToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object
parameter, CultureInfo culture)
{
return (int)value != 0;
}
9
<Entry x:Name="entry2"
Text=""
Placeholder="enter destination"
VerticalOptions="CenterAndExpand" />
<Button Text="Submit"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
IsEnabled="{Binding Source={x:Reference entry2},
Path=Text.Length,
Converter={StaticResource intToBool}}" />
</StackLayout>
</ContentPage>
ENLACES RELATIVOS:
10
Mode, de tipo RelativeBindingSourceMode, describe la
ubicación del origen de enlace en relación con la posición del
destino de enlace.
AncestorLevel, de tipo int, un nivel ancestral opcional a
buscar, cuando la Modepropiedad
es FindAncestor. Una AncestorLevelde nomite n-1instancias
de AncestorType.
AncestorType, de tipo Type, el tipo de antepasado a buscar,
cuando la Modepropiedad es FindAncestor.
RESERVAS VINCULANTES:
A veces, los enlaces de datos fallan porque el origen del enlace no se puede
resolver o porque el enlace se realiza correctamente pero devuelve un null
valor. Si bien estos escenarios se pueden manejar con convertidores de
valores u otro código adicional, los enlaces de datos se pueden hacer más
sólidos definiendo valores alternativos para usar si el proceso de enlace
falla. Esto se puede lograr definiendo las propiedades FallbackValue
y TargetNullValue en una expresión vinculante. Debido a que estas
propiedades residen en la BindingBase clase, se pueden usar con enlaces,
enlaces múltiples, enlaces compilados y con la Binding extensión de
marcado.
11
ENLACES MULTIPLES
Definir un IMultiValueConverter
La IMultiValueConverter interfaz permite aplicar lógica
personalizada a un archivo MultiBinding. Para asociar un
12
convertidor con MultiBinding, cree una clase que implemente
la IMultiValueConverterinterfaz y luego implemente los
métodos Converty ConvertBack:
public class AllTrueMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo
culture)
{
if (values == null || !targetType.IsAssignableFrom(typeof(bool)))
{
return false;
// Alternatively, return BindableProperty.UnsetValue to use the binding
FallbackValue
}
if (b)
{
return targetTypes.Select(t => (object)true).ToArray();
}
else
{
// Can't convert back from false because of ambiguity
return null;
}
}
}
13
El ConvertBackmétodo convierte un destino de enlace en los valores
de enlace de origen. Este método acepta cuatro argumentos:
LA INTERFAS DE COMANDO
14
Para usar la interfaz de comando, debe definir un enlace de datos que tenga
como destino la Command propiedad de Button. Puede
configurar CommandParameter datos arbitrarios para distinguir entre varios
botones si todos están vinculados a la misma ICommand propiedad en
ViewModel.
La interfaz ICommand
Se define en el espacio de nombres System.Windows.Input y consta de dos
métodos y un evento:
public interface ICommand
{
public void Execute (Object parameter);
ENLACES COMPILADOS
15
Los enlaces compilados se resuelven más rápidamente que los enlaces
clásicos, lo que mejora el rendimiento del enlace de datos en las
aplicaciones de Xamarin.Forms.
17