2015-03-19 3 views
1

Я пытаюсь связать видимость сетки, но не могу этого сделать.Видимость привязки к сетке не работает

//ViewModel Class 
private Visibility _isVisiblePane = Visibility.Hidden; 
     public Visibility isVisiblePane { 
      get 
      { 
       return _isVisiblePane; 
      } 
      set 
      { 

       _isVisiblePane = value; 
       RaisePropertyChanged(() => "isVisiblePane"); 
      } 
     } 
//xaml code 
<Grid Visibility="{Binding Path=isVisiblePane}"> 
....My Content.... 
</Grid> 

Во время отладки программа устанавливает значение скрыто, но когда я изменить видимость _isVisiblePane, не обновляет видимость в GUI (сетка остается скрытой, а значение _isVisiblePane видно).

//in some function => on button click, value of _isVisiblePane updates to Visible but grid remains hidden. 
    isVisiblePane = isLastActiveDoc() == true ? Visibility.Visible : Visibility.Hidden; 

Ошибка! на линии RaisePropertyChanged ("isVisiblePane"). кажется, что нет никакой собственности с этим именем «Исключение типа„System.ArgumentException“произошло в GalaSoft.MvvmLight.dll, но не был обработан в пользовательском коде»

PS: Я попробовал IValueConverter метод с BOOL тоже. и все еще не выясняя, в чем проблема. Любая помощь?

+0

Да, я обновляя isVisiblePane –

+1

Вам нужно set Binding element или data context. Таким образом измените Visibility = {Binding Path = isVisiblePane, Source = ViewModel}. Кроме того, убедитесь, что ваш класс реализует INotifyProperyChanged interace или переводит свойство в DependencyProperty, если это класс интерфейса. –

+1

Вы видите какие-либо красные ошибки привязки в окне вывода при запуске приложения? –

ответ

2
  • Убедитесь, что ваш класс ViewModel реализует INotifyPropertyChanged.
  • Убедитесь, что RaisePropertyChanged, который в итоге вызывает PropertyChanged в соответствующем контексте потока, если ваше представление также является вашим пользовательским интерфейсом.

    public event PropertyChangedEventHandler PropertyChanged; 
    
    private void RaisePropertyChanged(String info) 
    { 
        if (PropertyChanged != null)    
         PropertyChanged(this, new PropertyChangedEventArgs(info));    
    } 
    
  • Убедитесь, что сетка либо имеет свой VM, как это контекст данных или указать правильный источник для вашего переплета.

  • Убедитесь, что RaisePropertyChanged имеет ничего связанного с ним через

    если (RaisePropertyChanged! = NULL) RaisePropertyChanged (....)

+1

в основном, вы сначала помещаете событие в var, а затем запускаете это событие, если оно не равно null var var = PropertyChanged; if (local! = null) local.Invoke (this, new PropertyChangedEventArgs (propertyName); ' – Icepickle

+0

Вы знаете, вы потрясающий!: D Да, моя модель просмотра не выполняла INotifyPropertyChanged. Я думал, что ее головная боль Призма не MVVM-Light. –

+0

@SaadAbdullah, 'INotifyPropertyChanged' является« головной болью »самого WPF. :) –

2

Не совсем отвечать, но:

  • ИМХО, вы не должны иметь видимость перечислений в ваших ViewModels. См., ViewModels должен быть агностиком самой технологии представления (понимаете, например, что INotifyPropertyChanged не является частью библиотек WPF). Поэтому привяжите вместо этого логическое значение и используйте converter.
  • Свойства Puiblic в .NET обычно следует за Pascal Casing, поэтому я предлагаю изменить isVisiblePane на IsPaneVisible.
  • Дважды проверьте DataContext вашего представления.
  • Запустите проект в режиме отладки и посмотрите консоль на сообщения о привязке.
+0

Я переименовал isVisiblePane => IsPaneVisible, ничего не происходит. Нет консольного сообщения в окне вывода –

+0

Спасибо! В моем случае это был DataContext: ' 'Это неправильно, так как он будет оценивать' SelectedObject.SelectedObject'. Следовательно, следующее правильное связывание: «Видимость =» {Binding Converter = {StaticResource nullToHiddenConverter}} "' – j00hi