2016-12-09 1 views
0

Иногда нам нужна страница без гамбургеров. Мы делаем это с помощью свойства IsFullScreen. Дополнительно мы хотим использовать это свойство IsFullScreen для переключения видимости всегда доступных общих элементов управления.IsFullScreen propertychanged событие в Template10 uwp apps

<UserControl Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"> 
</UserControl> 

public class MyViewModel : ViewModelBase 
{ 
    public bool IsVisible 
    { 
    get 
    { 
     return !SettingsService.IsFullScreen; 
    } 
    } 
} 

Как мы можем связать событие propertychanged для свойства IsFullScreen.

Спасибо за ваши усилия

ответ

1

Вы должны реализовать INotifyPropertyChanged в SettingsService классе. и RaisePropertyChanged(); (Это необходимо для Binding или вы можете использовать Dependency Property вместо.)

Как это: В SettingsService классе

public class SettingsService : INotifyPropertyChanged 
{ 
    public static SettingsService Instance { get; } = new SettingsService(); 

    bool _IsFullScreen; 
    public event EventHandler IsFullScreenChanged; 
    public bool IsFullScreen 
    { 
     get { return _IsFullScreen; } 
     set 
     { 
      if (_IsFullScreen != value) 
      { 
       _IsFullScreen = value; 
       // 
       RaisePropertyChanged(); //uses CallerMemberName 
       IsFullScreenChanged?.Invoke(this, EventArgs.Empty); 
      } 
     } 
    } 

    #region INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged([CallerMemberName] string propertyName = null) => 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

    #endregion 
} 

И в MyViewModel классе просто добавить свойство Settings.

public class MyViewModel : ViewModelBase 
{ 
    public SettingsService Settings => SettingsService.Instance; 
    // 
} 

И в файле XAML: В Binding пути написать путь свойства, как Settings.IsFullScreen (я использовал ValueWhenConverter для преобразования из BOOL в Visibility)

<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:converter="using:Template10.Converters" 
mc:Ignorable="d"> 

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

<Page.Resources> 
    <converter:ValueWhenConverter x:Key="VisibleWhenTrueConverter"> 
     <converter:ValueWhenConverter.When> 
      <x:Boolean>True</x:Boolean> 
     </converter:ValueWhenConverter.When> 
     <converter:ValueWhenConverter.Value> 
      <Visibility>Visible</Visibility> 
     </converter:ValueWhenConverter.Value> 
     <converter:ValueWhenConverter.Otherwise> 
      <Visibility>Collapsed</Visibility> 
     </converter:ValueWhenConverter.Otherwise> 
    </converter:ValueWhenConverter> 
    <converter:ValueWhenConverter x:Key="VisibleWhenFalseConverter"> 
     <converter:ValueWhenConverter.When> 
      <x:Boolean>False</x:Boolean> 
     </converter:ValueWhenConverter.When> 
     <converter:ValueWhenConverter.Value> 
      <Visibility>Visible</Visibility> 
     </converter:ValueWhenConverter.Value> 
     <converter:ValueWhenConverter.Otherwise> 
      <Visibility>Collapsed</Visibility> 
     </converter:ValueWhenConverter.Otherwise> 
    </converter:ValueWhenConverter> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <UserControl Visibility="{Binding Settings.IsFullScreen, Converter={StaticResource VisibleWhenFalseConverter}}"> 
    </UserControl> 
</Grid> 

+0

Пожалуйста, объясните, как это работает и почему это решить вопрос ОП. – Arashsoft

0

Спасибо за ваш ответ. Мы решили проблему следующим образом. Наш класс SettingsService является частью Template10 uwp extension. Для привязки данных мы используем инструментарий MVVM Light. Мы передали сообщение ScreenSizeChangedArgs

public class ScreenSizeChangedArgs : MessageBase 
{ 
    public bool IsFullScreen 
    { 
    get; set; 
    } 
    public ScreenSizeChangedArgs(bool isFullScreen) 
    { 
    IsFullScreen = isFullScreen; 
    } 
} 

Сообщение об изменении свойства IsFullScreen.

public class SettingsService 
{ 
    public static SettingsService Instance { get; } = new SettingsService(); 
    public bool IsFullScreen 
    { 
    get 
    { 
     return m_settingsHelper.Read<bool>(nameof(IsFullScreen), false); 
    } 
    set 
    { 
     m_settingsHelper.Write(nameof(IsFullScreen), value); 
     Views.Shell.HamburgerMenu.IsFullScreen = value; 
     Messenger.Default.Send(new ScreenSizeChangedArgs(value)); 
    } 
    } 
} 

В соответствующей модели представления мы фиксируем, что ScreenSizeChangedArgs сообщение и обрабатывать новое значение IsFullScreen.

public class MyViewModel : ViewModelBase 
{ 
    public bool IsVisible 
    { 
    get 
    { 
     return m_isVisible; 
    } 
    set 
    { 
     m_isVisible = value; 
     RaisePropertyChanged("IsVisible"); 
    } 
    } 
    public MyViewModel() 
    { 
    //The event when the IsFullScreen property has changed. 
    Messenger.Default.Register<ScreenSizeChangedArgs>(this, args => 
    { 
     IsVisible = !args.IsFullScreen; 
    }); 
    } 
} 

Для BOOL для преобразования видимости мы используем IValueConverter похожи, как этот http://blogs.u2u.be/diederik/post/2011/11/14/null.aspx