Как привязать видимость HamburgerButtonInfo к другой модели просмотра, отличной от ShellViewModel? - PullRequest
0 голосов
/ 16 июня 2020

Вопрос

  1. Как я могу изменить видимость моей кнопки гамбургера, не используя shellviewmodel? Ps: это приложение UWP, работающее над template10.
  2. Можно ли привязать видимость кнопки Hamburger к двум различным моделям просмотра в template10?

Shell.xaml

xmlns:vm="using:ScanWorx.ViewModels"
xmlns:converters="using:ScanWorx.ViewModels"

<Page.DataContext>
    <vm:ShellViewModel x:Name="ViewModel" />
</Page.DataContext>

<Page.Resources>
    <converters:BooleanToVisibilityConverter x:Key="Converter" />
</Page.Resources>

<controls:HamburgerMenu x:Name="MyHamburgerMenu">
    <controls:HamburgerMenu.PrimaryButtons>
        <!--  HeatMap Generator Button  -->
        <controls:HamburgerButtonInfo  ClearHistory="True" PageType="views:HeatMapGeneratorPage" 
                                       Visibility="{x:Bind vm:LoginPageViewModel.abc, Mode=TwoWay, 
                                                    Converter={StaticResource Converter}}">
            <StackPanel Orientation="Horizontal">
                <SymbolIcon
                    Width="48"
                    Height="48"
                    Symbol="ViewAll" />
                <TextBlock
                    Margin="12,0,0,0"
                    VerticalAlignment="Center"
                    Text="HeatMap Generator" />
            </StackPanel>
        </controls:HamburgerButtonInfo>

    </controls:HamburgerMenu.PrimaryButtons>
</controls:HamburgerMenu>

LoginPageViewModel.cs

namespace ScanWorx.ViewModels
{
   class LoginPageViewModel : ViewModelBase
   {
      public static bool abc { get; set; }
      public static Visibility visibility1 { get; set; }

      public async void Button_Login_Click()
      {
         try
         {
            *code to decrypt my login details and then after decryptng i check for next condition*
            if (ApplicationData.Current.LocalSettings.Values["UserAccessLevel"].ToString() == "Administrator")
            {
                abc = true;
                visibility1 = Visibility.Visible;
            }
            else
            {
                abc = false;
                visibility1 = Visibility.Collapsed;
            }
         }
      }
   }
}

ShellViewModel.cs :

  • Если я использую shellviewModel в привязке Скрытие отлично работает, изменяя - Visibility="{x:Bind vm:ShellViewModel.ShowButton}, но с этим он может быть только жестко закодирован либо false, либо true, что делает его видимым или свертывается один раз при запуске приложения.
  • Но я не хочу изменить видимость моей кнопки с помощью модели представления оболочки, я хочу изменить ее после входа в систему с помощью LoginPageViewModel *

     namespace ScanWorx.ViewModels
     {
        class ShellViewModel : ViewModelBase
        {
           public static bool ShowButton { get; set; }
    
           public ShellViewModel()
           {
             ShowButton = false;
           }
        }
     }
    

1 Ответ

0 голосов
/ 17 июня 2020

Как привязать видимость HamburgerButtonInfo к другой модели просмотра, отличной от ShellViewModel?

Лучше всего создать глобальный класс настроек для записи при входе в систему. После успешного входа в систему измените свойство bool ShowButton на значение true.

Setting.cs

public class Setting : INotifyPropertyChanged
{
    private bool _showBtn = false;
    public bool ShowBtn
    {
        get { return _showBtn; }
        set { _showBtn = value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Xaml bind

<Application.Resources>
    <ResourceDictionary>
        <local:Setting x:Key="Setting"/>
    </ResourceDictionary>
</Application.Resources>

......

Visibility="{Binding ShowBtn, Source={StaticResource Setting}}"

Изменение значения

((Setting)Application.Current.Resources["Setting"]).ShowBtn = true;
...