2013-05-19 3 views
0

В приложении WP8 у меня мало элементов управления, где я привязываю цвет переднего плана, который я изменяю в коде. Но OnPropertyChanged не срабатывает, когда произошло событие пользователя.Метод OnPropertyChanged не срабатывает

Я определил эту привязку «ControlForeground» в своем текстовом блоке и элементах управления шаблонами данных для радиообмена. Я пытаюсь изменить цвет переднего плана, когда пользователь нажимает кнопку. Но мое новое назначение цвета не обновляет пользовательский интерфейс. Что-нибудь я здесь не хватает?

В XAML

<TextBlock x:Name="lblTileColor" TextWrapping="Wrap" Text="Selected color:" Foreground="{Binding ControlForeground, Mode=TwoWay}"/> 
<TextBlock x:Name="lblTileColor2" TextWrapping="Wrap" Text="App bg:" Foreground="{Binding ControlForeground, Mode=TwoWay}"/> 
<RadioButton x:Name="accentColor" IsChecked="true" BorderBrush="White" Foreground="{Binding ControlForeground, Mode=TwoWay}"> 
        <RadioButton.ContentTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <Rectangle Width="25" Height="25" Fill="{StaticResource PhoneAccentBrush}"/> 
           <TextBlock Width="10"/> 
           <TextBlock x:Name="lblDefaultAccent" Text="Default accent color" Foreground="{Binding ControlForeground, Mode=TwoWay}"/> 
          </StackPanel> 
         </DataTemplate> 
        </RadioButton.ContentTemplate> 
       </RadioButton> 

<Button x:name="UpdateColor" click="update_btn"/> 

В C#,

public class ColorClass : INotifyPropertyChanged 
{ 
    private SolidColorBrush _ControlForeground; 
    public SolidColorBrush ControlForeground 
    { 
     get 
     { 
      return _ControlForeground; 
     } 

     set 
     { 
      _ControlForeground = value; 
      OnPropertyChanged("ControlForeground"); 
     } 
    } 

    public ColorClass() { } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

public class ColorPage:PhoneApplicationPage{ 

    public ObservableCollection<ColorClass> TestCollection { get; private set; } 

    public void update_btn(object sender, EventArgs e){ 
      TestCollection.Add(new ColorClass() 
      { 
       ControlForeground = new SolidColorBrush(Colors.Red) 
      }); 
    } 

} 
+0

Устанавливаете ли вы свой контекст данных? Обычно я вижу это в .Net 4.0 с WPF, когда модель класса/представления не имеет набора данных datacontext. – tsells

+0

Да, я установил свой контекст данных в конструкторе класса ColorPage .... this.DataContext = TestCollection; – Mahender

+0

Вы установили точку останова в методе 'OnPropertyChanged', чтобы увидеть, действительно ли он вызывает делегат' PropertyChanged'? – PoweredByOrange

ответ

1

Для вашей второй проблемы (не имея возможности связывать элементы управления внутри шаблона данных), это связано с тем, что эти элементы управления будут использовать контекст данных родительского шаблона, а не контекст данных страницы.

Чтобы исправить это, вы должны сообщить этим элементам управления имя элемента с контекстом данных и дать ему полный путь к вашему свойству.

<TextBlock 
    x:Name="lblDefaultAccent" 
    Text="Default accent color" 
    Foreground="{Binding DataContext.ControlForeground, 
         ElementName=LayoutRoot, Mode=TwoWay}"/> 

Как вы можете видеть выше, вы должны указать имя элемента. Если вы связали это с помощью this.DataContext = colorClass, тогда имя элемента будет именем внешней сетки в вашем xaml, по умолчанию LayoutRoot

+0

Спасибо, это решило проблему. – Mahender

1

Вы можете только связать ObservableCollection к элементам управления, которые ожидают его, как ListBox или LongListSelector. Кроме того, добавление Brush в TestCollection не вызывает нефункциональное уведомление, поскольку оно не вызывает средство настройки этого свойства, просто изменяет существующий объект.

Сделайте TestCollection a ColorClass и измените .Add, чтобы просто изменить свойство ColorClass.ControlForeground, и это должно «просто работать».

+0

Спасибо, он работает для обычного переднего плана - но он не обновляет цвет переднего плана для элементов управления, которые определены в шаблоне содержимого для радиообмена. Как я могу распространить это на эти элементы управления? – Mahender