2012-06-26 4 views
0

Я пытаюсь связать флаги видимости пары сеток, однако они, кажется, игнорируют мои попытки. Любая помощь будет оценена по достоинству. Благодаря!WPF привязка к унаследованному значению

Это в моем экраны XAML:

<Grid Name="grdNotifLogo" Style="{StaticResource insightLogoNotify}" Visibility="{Binding Path=_notifVisibility, Mode=OneWay}" MouseDown="grdNotifLogo_MouseDown"/> 
<Grid Name="grdMainLogo" Style="{StaticResource insightLogo}" Visibility="{Binding Path=_logoVisibility, Mode=OneWay}"/> 

Экраны xaml.cs файл наследует окно базового класса, который имеет это:

protected Visibility _logoVisibility = _ Visibility.Visible; 
protected Visibility _notifVisibility = _ Visibility.Collapsed; 
public bool NotificationIconEnabled 
{ 
    get { return _notifVisibility == Visibility.Visible; } 
    set 
    { 
     if (value) 
     { 
      _logoVisibility = Visibility.Collapsed; 
      _notifVisibility = Visibility.Visible; 
     } 
     else 
     { 
      _logoVisibility = Visibility.Visible; 
      _notifVisibility = Visibility.Collapsed; 
     } 
    } 
} 

Контекст данных также установка в сетке который владеет моими сетями:

 ToolBar.DataContext = this; 
+0

Вы привязываете свою видимость к «защищенным» полям; вы должны быть привязаны к общедоступному свойству (http://msdn.microsoft.com/en-us/library/ms743643.aspx) – Thelonias

+1

Существует также уведомление об изменении. –

ответ

1

Да, между Райаном, Адамом и Тиграном у вас есть свой ответ. В коде полное решение будет выглядеть примерно так, как показано ниже. Обратите внимание, что при использовании ключевого слова «Связывание» вы пытаетесь получить доступ к свойствам вне контекста данных вашего элемента управления. Вот почему вы должны установить свойство DataContext вашего элемента управления классу, который имеет эти свойства. Как отмечает Райан, свойства также должны быть общедоступными, иначе вы не сможете привязываться к ним. Наконец, как отмечает Адам, вы должны использовать интерфейс INotifyPropertyChanged для передачи изменений в свойствах объекта вашей модели представления в ваш элемент управления.

Так XAML оптимизирован, чтобы указать на новые имена публичной собственности:

<Grid Name="grdNotifLogo" Style="{StaticResource insightLogoNotify}" Visibility="{Binding NotificationVisibility}" MouseDown="grdNotifLogo_MouseDown"/> 
<Grid Name="grdMainLogo" Style="{StaticResource insightLogo}" Visibility="{Binding LogoVisibility}"/> 

Установить контекст данных элемента управления:

class MyControl : UserControl 
{ 
    public MyControl() 
    { 
     InitializeComponent(); 
     this.DataContext = new MyViewModel(); 
    } 
} 

Создать новый класс вид-модель для установки в качестве ваш информационный контекст:

class MyViewModel : INotifyPropertyChanged 
{ 
    private Visibility _logoVisibility = Visibility.Visible; 
    private Visibility _notifVisibility = Visibility.Collapsed; 

    public Visibility LogoVisibility 
    { 
     get { return _logoVisibility; } 
    } 

    public Visibility NotificationVisibility 
    { 
     get { return _notifVisibility; } 
    } 

    public bool NotificationIconEnabled 
    { 
     get { return _notifVisibility == Visibility.Visible; } 
     set 
     { 
      if (value) 
      { 
       _logoVisibility = Visibility.Collapsed; 
       _notifVisibility = Visibility.Visible; 
      } 
      else 
      { 
       _logoVisibility = Visibility.Visible; 
       _notifVisibility = Visibility.Collapsed; 
      } 
      OnPropertyChanged("LogoVisibility"); 
      OnPropertyChanged("NotificationVisibility"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion // INotifyPropertyChanged Members 
} 
+0

У меня уже был datacontext (обновленный вопрос), но у меня не было этих вызовов OnPropertyChanged. Благодаря! Он решил проблему. – Tim

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