Привязка к настройкам Template10 с главной страницы

Мне пока нравится Template10, очень приятно. Я немного застрял в том, как привязать значение параметра на главной странице. Я добавил новую настройку bool, которая правильно сохраняется. На моей главной странице у меня есть привязка видимости к настройке:

Visibility="{Binding UseAmbientLightSensor, Converter={StaticResource CollapsedWhenFalseConverter}}"

Это работает при запуске приложения, как и ожидалось, MainPageViewModel считывает значение из настроек, и сетка отображается или сворачивается в зависимости от этого параметра.

Однако я не могу заставить эту привязку «прослушивать» настройку, если я перейду на страницу настроек и изменю это значение, когда я вернусь на главную страницу, видимость не изменится. Это работает, только если я перезапущу приложение.

В установке vanilla Template10 это было бы похоже на привязку небольшого логотипа на главной странице к настройке «UseLightThemeButton» на странице настроек, которая изменяется в зависимости от этой настройки.


person BGTurner    schedule 29.02.2016    source источник
comment
Не забудьте отметить ответ.   -  person Jerry Nixon    schedule 04.03.2016


Ответы (2)


Хорошо, я думаю, это «официальный» ответ. Но многие подходы верны. Этот наиболее точно соответствует шаблонам. Я бы сделал это так:

public class MainPageViewModel : ViewModelBase
{
    Services.SettingService.SettingService _SettingService;

    public MainPageViewModel()
    {
        _SettingService = Services.SettingService.SettingService.Instance;
    }

    public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
    {
        Windows.Storage.ApplicationData.Current.DataChanged += SettingsChanged;
        await Task.CompletedTask;
    }

    public override async Task OnNavigatedFromAsync(IDictionary<string, object> pageState, bool suspending)
    {
        Windows.Storage.ApplicationData.Current.DataChanged -= SettingsChanged;
        await Task.CompletedTask;
    }

    private void SettingsChanged(Windows.Storage.ApplicationData sender, object args)
    {
        RaisePropertyChanged(nameof(FontSize));
    }

    public double FontSize { get { return _SettingService.FontSize; } }
}

С этой моделью представления вы можете легко привязаться к настройке (в данном случае FontSize).

Удачи.

person Jerry Nixon    schedule 29.02.2016
comment
Отлично, это ответ на вопрос, который я собирался задать еще до того, как дошел до него. Любящий шаблонНа 10 больше каждый день. Спасибо, Джерри! - person dub stylee; 01.03.2016
comment
Кроме того, это также работает, если вы решите перемещать свои настройки, а затем они будут изменены на другом устройстве в другом месте. - person Jerry Nixon; 04.03.2016

Есть два возможных сценария, которые могут не произойти:

  • Поднимите событие изменения свойства, когда ваше логическое значение будет обновлено.
  • Установите привязку в двусторонний режим.

Для этого измените режим привязки вашего свойства Visibility.

Visibility="{Binding UseAmbientLightSensor, Mode=TwoWay, Converter={StaticResource CollapsedWhenFalseConverter}}"

Это сообщит xaml прослушивать любые изменения в свойство в модели представления.

Затем вам нужно сообщить модели представления, когда сообщать представлению XAML о своих изменениях, если вы используете Template10, то это можно сделать следующим образом:

private bool useAmbientLightSensor;

public TodoListControlViewModel UseAmbientLightSensor
{
    get
    {
        return this.useAmbientLightSensor;
    }

    set
    {
        this.Set(ref this.useAmbientLightSensor, value);
    }
}

Модель представления должна расширяться от класса ViewModelBase, который предоставляет метод Set, вызывающий событие OnPropertyChanged, позволяя представлению узнавать о любых изменениях в модели представления.

Для получения дополнительной информации см. INotifyPropertyChanged интерфейс и ее реализация.

person Nahuel Ianni    schedule 29.02.2016
comment
Обычно я делаю это так, но Template10 кажется немного другим, и я пытаюсь сохранить свой код в соответствии со значениями по умолчанию, чтобы настройки обновлялись в службе настроек. SettingsViewModel сохраняет изменения через экземпляр SettingsService и вызывает событие PropertyChanged. Однако свойство в MainPageViewModel не отвечает на эти события. На данный момент я обошел это, используя UseAmbientLightSensor = _settings.UseAmbientLightSensor; внутри моего обработчика OnNavigatedToAsync, который перезагружает настройки при возврате со страницы настроек. - person BGTurner; 29.02.2016
comment
Он никогда не отреагирует на изменения без свойства и правильной привязки. У тебя есть эти двое на месте? Кроме того, вы используете скомпилированную привязку? - person Nahuel Ianni; 29.02.2016