Jade-ERP #3 – Pasek narzędziowy

Niestety w tym tygodniu nie znalazłem wystarczająco dużo wolnego czasu, aby zająć się rozwijaniem projektu, aczkolwiek udało mi się zaimplementować jedną z zakładanych funkcjonalności. A jest nią pasek narzędziowy u dołu widoku.

 

Co z tym paskiem?

Od teraz w zależności o rodzaju wyświetlonej zakładki, pasek narzędziowego będzie wypełniany odpowiednią zawartością. Dla listy kontrahentów na razie wygląda to następująco:

W jaki sposób pasek określa swoją zawartość? Spójrzmy na definicje widoku paska:

<UserControl x:Class="ProjectERP.Views.Toolbars.ViewsManagmentToolbarView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d"
             Height="35" Width="Auto"
             d:DesignHeight="35" d:DesignWidth="300" HorizontalAlignment="Stretch">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
    </UserControl.Resources>
    <materialDesign:ColorZone HorizontalAlignment="Stretch" Mode="Accent">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
            <Button Margin="2" Command="{Binding AddItemCommand}"
                    Visibility="{Binding Path=AddButtonVisible, Converter={StaticResource BoolToVis}}">
                <materialDesign:PackIcon Kind="Plus" />
            </Button>
            <Button Margin="2" Visibility="{Binding Path=DeleteButtonVisible, Converter={StaticResource BoolToVis}}">
                <materialDesign:PackIcon Kind="Delete" />
            </Button>
        </StackPanel>
    </materialDesign:ColorZone>
</UserControl>

 

Zaznaczam, że pasek należy do zawartości widoku głównego aplikacji. W tym momencie nie posiada on własnego modelu widoku, na razie pasek korzysta z modelu widoku głównego okna. Jest to rzecz, którą w najbliższym czasie będę musiał poprawić.
W modelu widoku, widoku głównego dodałem dwie właściwości odpowiadające za widoczność obu przycisków. To czy są one widoczne, czy nie, zależy od aktywnej zakładki. Każda zakładka (jej model widoku) implementuje interfejs, który jasno określa jakie działania są na niej możliwe.

Interfejs:

public interface IContentView
{
   bool CanAddItem { get; }
   bool CanDeleteItem { get; }
}

 

W momencie zmiany zakładki wywoływana jest komenda obsługująca tą sytuację:

public RelayCommand<MainTabItem> ChangeActiveTabCommand
{
    get
    {
        return _changeActiveTabCommand
               ?? (_changeActiveTabCommand = new RelayCommand<MainTabItem>(
                   item =>
                   {
                       if (item.Content.DataContext == null)
                           return;
                       var contentView = (IContentView)item.Content.DataContext;

                       var contentViewMessage = new ContentViewMessage
                       {
                           ContentView = contentView

                       };

                       Messenger.Default.Send(contentViewMessage);
                   }));
    }
}

 

Jej zadaniem jest wysłanie wiadomości, z zawartością nowej zakładki do głównego modelu widoku aplikacji. Po odebraniu wiadomości i odczytaniu pól CanAddItem oraz CanDeleteItem odpowiednio ustawiamy zmienne odpowiadające widoczności przycisków na pasku narzędziowym.
Na razie takie rozwiązanie działa, ale jestem pewien, że jeszcze je zmodyfikuje, a na pewno postaram się odciążyć główny model widoku i przeniosę logikę ustawiania zawartości paska do jego własnego modelu widoku.

 

Mam coś dla Ciebie

Zapisz się do mojego newslettera, a ja prześlę Ci zbiór kilkunastu praktycznych wskazówek dla programisty aplikacji mobilnych.

Menu