2015-10-16 2 views
4

Я довольно новичок в Xaml.
Я изучаю UWP (универсальная платформа Windows), и у меня есть больше кнопок, и я хочу привязать их свойство Background к свойству ViewModel, которое будет меняться во время некоторых событий.Как установить привязку в стиле?

Я реализовал INotifyPropertyChanged и все работает нормально (цвет кнопки меняется), когда я связать свойство фона в объявлении кнопки в XAML:

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

Я не знаю, как хорошо это объявить ViewModel для App.xaml, но это решение, которое я нашел для имеющих глобальные переменные (переменные удерживаются внутри ViewModel).

Теперь вернемся к моему вопросу: Как я не хочу, чтобы связать фона на каждой кнопке, я пытался добавить его в стиле, как это:

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

Но теперь, когда переменная цвет меняется во время запуска приложения, пользовательский интерфейс больше не обновляется. Кажется, что привязанные свойства в стилях не реагируют на изменения переменных.

Что я делаю неправильно? Благодарим за любые ответы.

+0

Вы пытались использовать viewmodel как DynamicResource? –

+0

DynamicResource не существует в приложениях магазина uwp/windows api –

+1

Причина, по которой он не работает, заключается в том, что стиль добавляется как staticResource, поэтому даже когда он изменяется под обложками, он уведомляет связанные кнопки. –

ответ

0

После еще поисков я нашел видео с Джерри Никсон: http://blog.jerrynixon.com/2013/01/walkthrough-dynamically-skinning-your.html

Это кажется, что, поскольку мы не имеем DynamicResource в UWP/WinRT, мы должны сделать трюк: Мы на последующую навигацию же кадра. Таким образом, после того, как мы изменяем свойство, мы должны сделать что-то вроде этого:

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

Это как недействительности контроля в Windows Forms. Это заставляет пользовательский интерфейс перерисовываться. Я не уверен, что у этого есть побочные эффекты, мне придется больше копать. Я вернусь, если найду.

+0

Я проверяю один и тот же блог :) –

Смежные вопросы