2

到目前为止,我很喜欢 Template10,非常好。尽管我对如何绑定到主页上的设置值有些困惑。我添加了一个正确存储的新布尔设置。在我的主页上,我有一个与设置的可见性绑定:

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

这适用于应用程序按预期启动,MainPageViewModel 从设置中读取值,并且网格基于该设置可见或折叠。

但是,如果我转到设置页面并更改该值,我似乎无法让此绑定“监听”设置,当我返回主页时,可见性不会改变。它仅在我重新启动应用程序时才有效。

在 vanilla Template10 安装中,这类似于将 MainPage 上的一个小徽标绑定到“设置”页面中的“UseLightThemeButton”设置,该设置会根据该设置进行更改。

4

2 回答 2

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)。

祝你好运。

于 2016-02-29T23:29:28.360 回答
0

有两种可能的情况可能不会发生:

  • 当您的布尔值更新时引发属性更改事件。
  • 将绑定设置为双向模式。

为了做到这一点,改变你的Visibility财产的绑定模式

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

这将告诉监听视图模型中属性的任何更改。

然后你需要告诉 View 模型什么时候让 XAML 视图知道它的变化,如果你使用的是 Template10,那么可以这样做:

private bool useAmbientLightSensor;

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

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

视图模型需要从提供引发事件ViewModelBase的方法的类扩展,允许视图知道视图模型中的任何更改。SetOnPropertyChanged

有关更多信息,请检查INotifyPropertyChanged 接口及其实现

于 2016-02-29T08:24:05.390 回答