c# - bindingcontext - xaml converter xamarin
¿Qué espacio de nombres y ensamblaje debo usar para declarar un convertidor en un proyecto compartido? (2)
Pregúntate para qué están .Android
.WinPhone
y .Android
. Recuerde, la asamblea es el nombre al que la clase tiene que hacer referencia. Es probable que LeMagXam
contenga solo los elementos comunes, no los detalles de la plataforma. Piensa en System.Collection
: ese espacio de nombres no tiene List
o Dictionary
in, pero System.Collection.Generics
no
¿Qué hace el convertidor de ancho? Si se trata simplemente de una propiedad que realiza algunas operaciones matemáticas básicas (por ejemplo, convertir pies en metros), no es necesario tener esto en un espacio de nombre específico de la plataforma. Si está estableciendo un ancho específico de plataforma, entonces nuevamente no necesita usar un espacio de nombre específico de la plataforma ya que Xam.Forms ya le permite hacer ese tipo de cosas de todos modos con el Device.OnPlatform
(creo que se llama).
Espero que esto ayude
¿Qué espacio de nombres y ensamblaje debo usar para declarar un convertidor en un proyecto compartido en Xamarin?
para este recurso
<TabbedPage.Resources>
<ResourceDictionary>
<local:WidthConverter x:Key="widthConverter"/>
</ResourceDictionary>
</TabbedPage.Resources>
Si elijo WindowsPhone como Startup Project, esta declaración funcionará:
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.WinPhone"
Si elijo Android como Startup Project, esta declaración funcionará:
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.Android"
Ahora, ¿qué debería usar para que funcione en MixedPlateform, lo intenté pero sin éxito?
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam"
Gracias de antemano.
EDITAR existe mi código completo para una mejor comprensión
<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="LeMagXam.View.HomePage"
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam"
Title="LeMag"
BackgroundImage="bg_light.png"
ItemsSource="{Binding CategoriesList}"
>
<TabbedPage.Resources>
<ResourceDictionary>
<local:WidthConverter x:Key="widthConverter"/>
</ResourceDictionary>
</TabbedPage.Resources>
<TabbedPage.ItemTemplate>
<DataTemplate>
<ContentPage Title="{Binding Name}">
<-- ... -->
<Image Source="{Binding Category.ImageArticleTitle.Source}" HorizontalOptions="Start"
WidthRequest="{Binding , Converter={StaticResource widthConverter},
ConverterParameter=150}"
<-- ... -->
</ContentPage>
</DataTemplate>
</TabbedPage.ItemTemplate>
</TabbedPage>
WidthConverter.cs
namespace LeMagXam
{
public class WidthConverter : IValueConverter
{
#region IValueConverter implementation
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)parameter * App.RatioWidth;
}
public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException ();
}
#endregion
}
}
Recuerde que un proyecto compartido no tiene productos compilables.
Por lo tanto, no habrá un ensamblaje LeMagXam que se generaría.
En cambio, los contenidos del proyecto compartido se compilan en el proyecto que lo hace referencia.
Por lo tanto, los siguientes, como usted mencionó, ambos trabajarán en sus propios proyectos específicos de plataforma :
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.WinPhone"
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXam.Android"
Para evitar esto, puede usar:
xmlns:local="clr-namespace:LeMagXam"
Si esto no funciona, considere la posibilidad de crear un proyecto PCL y poner el convertidor dentro de él.
Un proyecto PCL tiene una salida compilable. Por lo tanto, podría usar la misma declaración en todas las páginas XAML que usa el mismo ensamblaje de salida, como sigue: -
xmlns:local="clr-namespace:LeMagXam;assembly=LeMagXamPCL"
Recuerde hacer referencia al Proyecto PCL desde el proyecto específico de la plataforma .