Tengo el siguiente trozo de código xaml en el que muestro un calendario, cuyas propiedades “Locale” y “FirstDayOfWeek” dependen de un componente, Resources que cambia según la localización que escoja el usuario. Trozo xaml:
<StackLayout Padding="5, 10, 5, 10">
<calendar:SfCalendar x:Name="calendar"
ViewMode="MonthView"
YearViewMode="Month"
Margin="10, 5, 10, 5"
NavigationDirection="Vertical"
ShowInlineEvents="True"
InlineViewMode="Agenda"
VerticalOptions="FillAndExpand"
Locale="{Binding Source=localization, Path=Resources}"
FirstDayofWeek="{Binding Resources(LocalizationFirstDay)}">
<calendar:SfCalendar.MonthViewSettings>
<calendar:MonthViewSettings>
<calendar:MonthViewSettings.InlineItemTemplate>
<DataTemplate>
<Button AutomationId="{Binding AutomationId}"
Text="Texto" TextColor="#bbd5ed"/>
</DataTemplate>
</calendar:MonthViewSettings.InlineItemTemplate>
</calendar:MonthViewSettings>
</calendar:SfCalendar.MonthViewSettings>
</calendar:SfCalendar>
</StackLayout>
Clase model:
public class MediaViewModel : BaseViewModel
{
public CultureInfo localization;
public int localizationFirstDay;
public MediaViewModel()
{
localization = Resources.CurrentCultureI();
localizationFirstDay = (int)Resources.CurrentCultureI().DateTimeFormat.FirstDayOfWeek;
}
}
En el BaseViewModel viene especificado el componente:
public class BaseViewModel : INotifyPropertyChanged
{
...
public LocalizedResources Resources
{
get => App.LocResources;
private set { }
}
...
}
La clase LocaizedResources:
public class LocalizedResources : INotifyPropertyChanged
{
const string DEFAULT_LANGUAGE = "";
readonly ResourceManager ResourceManager;
CultureInfo CurrentCultureInfo;
public string this(string key)
{
get => ResourceManager.GetString(key, CurrentCultureInfo);
}
public LocalizedResources(Type resource, string language = null)
: this(resource, new CultureInfo(language ?? DEFAULT_LANGUAGE))
{ }
public LocalizedResources(Type resource, CultureInfo cultureInfo)
{
CurrentCultureInfo = cultureInfo;
ResourceManager = new ResourceManager(resource);
MessagingCenter.Subscribe<object, CultureChangedMessage>(this,
String.Empty, OnCultureChanged);
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnCultureChanged(object s, CultureChangedMessage ccm)
{
CurrentCultureInfo = ccm.NewCultureInfo;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
}
public string CurrentCulture() => CurrentCultureInfo.Name;
public CultureInfo CurrentCultureI() => CurrentCultureInfo;
}
Volviendo al xaml, la propiedad “FirstDayOfWeek” se actualiza correctamente cuando cambio el idioma, pero el Locale, que es compuesta no. Tengo otro par de casos con el mismo problema, pero supongo que es un tema de poner las propiedades adecuadas en el Binding, ¿me podéis ayudar?
Muchas gracias.