如何在样式中设置绑定?

时间:2015-10-16 10:03:03

标签: c# xaml mvvm windows-phone-8.1 uwp

我对Xaml很新。
我正在学习UWP(通用Windows平台),我有更多按钮,我想将他们的Background属性绑定到ViewModel的属性,该属性将在某些事件期间发生变化。

当我在XAML中的Buttons声明中绑定Background属性时,我实现了INotifyPropertyChanged并且一切正常(按钮的颜色改变了):

<Button Content="0" Grid.Column="0" Grid.Row="5"
                Background="{Binding ButtonColor, Source={StaticResource AppViewModel}}" Style="{StaticResource BasicButton}"/>

StaticResource AppViewModel是App.xaml中的资源:

<Application.Resources>
    <viewModel:AppViewModel x:Key="AppViewModel" />
</Application.Resources>

我不知道为App.xaml声明一个ViewModel有多好,但是我找到了一个解决方案,它有全局变量(变量保存在viewModel中)。

现在回到我的问题: 因为我不想在每个按钮上绑定Background,所以我尝试将它添加到这样的样式:

<Style x:Key="BasicButton" TargetType="Button">
            <Setter Property="Background" Value="{Binding ButtonColor, Source={StaticResource AppViewModel}}" />
</Style>

但是现在当颜色变量在运行应用程序期间发生变化时,UI不再更新。 似乎样式中的绑定属性不会响应变量的变化。

我做错了什么? 谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

经过更多搜索后,我发现了杰里·尼克松的视频:http://blog.jerrynixon.com/2013/01/walkthrough-dynamically-skinning-your.html

似乎因为我们在uwp / winrt中没有DynamicResource,所以我们必须做一个技巧: 我们改为同一帧。因此,在我们更改属性后,我们必须执行以下操作:

var frame = Window.Current.Content as Frame;
frame.Navigate(frame.Content.GetType());
frame.GoBack();

就像在Windows窗体中使控件失效一样。它正在重绘UI本身。 我不确定这是否有副作用,我不得不挖掘更多。如果我找到,我会回来的。

相关问题