Вместо того, чтобы каждая страница вставляла элементы управления в заголовок, мы решили позволить заголовку определить все возможные элементы управления и сделать видимыми только те, которые доступны на данной странице.
Например, мой вопросRightHeaderArea
был изменен, чтобы выглядеть следующим образом:
<StackLayout Spacing="10" HorizontalOptions="End" Orientation="Horizontal" Grid.Column="2">
<svg:SvgCachedImage VerticalOptions="Center" WidthRequest="30" HeightRequest="30"
IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadHistory}}"
Source="resource://Uploader.Images.icon-viewUploadHistory.svg">
<svg:SvgCachedImage.GestureRecognizers>
<TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadHistory}}" />
</svg:SvgCachedImage.GestureRecognizers>
</svg:SvgCachedImage>
<svg:SvgCachedImage VerticalOptions="Center" WidthRequest="35" HeightRequest="35"
IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadQueue}}"
Source="resource://Uploader.Images.icon-viewUploadQueue.svg">
<svg:SvgCachedImage.GestureRecognizers>
<TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.ViewUploadQueue}}" />
</svg:SvgCachedImage.GestureRecognizers>
</svg:SvgCachedImage>
<svg:SvgCachedImage Grid.Column="2" VerticalOptions="Center" WidthRequest="60" HeightRequest="50"
IsVisible="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToBoolConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.Upload}}"
Source="resource://Uploader.Images.icon-upload.svg">
<svg:SvgCachedImage.GestureRecognizers>
<TapGestureRecognizer Command="{TemplateBinding BindingContext.AvailableToolbarCommands, Converter={StaticResource tclsToCommandConverter}, ConverterParameter={x:Static mod:ToolbarCommandName.Upload}}" />
</svg:SvgCachedImage.GestureRecognizers>
</svg:SvgCachedImage>
</StackLayout>
Все мои ViewModels имеют открытое свойство AvailableToolbarCommands
, которое является List<ToolbarCommandLink>
, где ToolbarCommandLink
является простым классом, который содержит Command
и пользовательское значение перечисления (ToolbarCommandName
).
Чтобы все это работало, это конвертеры.tclsToBoolConverter
возвращает true, если значение (List) содержит ToolbarCommandLink с именем, соответствующим параметру (ToolbarCommandName);tclsToCommandConverter
возвращает Команду в ToolbarCommandLink, которую он находит в значении (List), которое соответствует параметру.