2016-12-23 10 views
1

Я борюсь с некоторыми привязками данных. В моем MainWindow у меня есть две кнопки, которые привязываются к свойству Result в классе «Свойства» - строго для хранения свойств, которые я буду использовать для привязки данных. Кнопки скрыты по умолчанию, и когда я хочу, чтобы они стали видимыми, я просто установил свойство Result, что они привязаны к «True».Событие WPF PropertyChanged равно null после обновления свойства

Я знаю, что привязка данных работает, потому что если я ставлю свойство на статическое значение, кнопки видны/не видны. Ниже моего XAML

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
         <StackPanel.Resources> 
          <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
         </StackPanel.Resources> 

         <Button x:Name="btnBack" Height="25" Content="&lt;- Back" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Click="btnBack_Click" Margin="0,0,10,0" /> 

         <Button x:Name="btnNext" Height="25" Content="Next ->" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Click="btnNext_Click" Margin="10,0,0,0"/> 
        </StackPanel> 

Таким образом, они связаны с собственностью «Результата», и у меня есть UpdateSourceTrigger=Propertychanged в моем переплете.

В моем классе «Свойства» У меня есть ниже и AM реализации INotifyPropertyChanged

bool _result; 

    #endregion 

    public bool Result { 
     get 
     { 
      return _result; 
     } 
     set 
     { 
      _result = value; 
      NotifyPropertyChanged("Result"); 

     } 
    } 

    #region EVENTS 



    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 

Но по какой-то причине, когда я изменить свойство «True» PropertyChanged события равна нулю, и поэтому событие не срабатывает.

Любая идея, почему это происходит? Может быть, потому, что этот код отсутствует в моей модели ViewModel и только в отдельном классе?

+0

Это должно быть в вашей модели представления и модели представления должны быть отнесены к вашему 'DataContext'. – jsanalytics

+0

Спасибо, что я попробовал сейчас. Я буду обновлять с помощью Resutls – ganjeii

+0

Это работает! Спасибо! – ganjeii

ответ

1

Убедитесь, что вы установили DataContext окна в экземпляр вашего класса Properties и не задаете для свойства DataContext любого родительского элемента StackPanel что-то еще, потому что DataContext наследуется.

См. Следующий пример кода. Кнопки же становятся видны, как ожидается, после 3-секундной задержки:

public partial class MainWindow : Window 
{ 
    private Properties _viewModel = new Properties(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = _viewModel; 

     this.Loaded += async (s, e) => 
     { 
      await Task.Delay(3000); 
      _viewModel.Result = true; 
     }; 
    } 
} 

public class Properties : INotifyPropertyChanged 
{ 
    bool _result; 
    public bool Result 
    { 
     get 
     { 
      return _result; 
     } 
     set 
     { 
      _result = value; 
      NotifyPropertyChanged("Result"); 

     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="300" Width="300"> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
     <StackPanel.Resources> 
      <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
     </StackPanel.Resources> 

     <Button x:Name="btnBack" Height="25" Content="&lt;- Back" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Margin="0,0,10,0" /> 

     <Button x:Name="btnNext" Height="25" Content="Next ->" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Margin="10,0,0,0"/> 
    </StackPanel> 
</Window> 
+0

Это отличный ответ, спасибо за ссылку на код. Я выяснил, в чем проблема. Я не упоминал, что я устанавливал свойство из класса. Наверное, я был немного обманчив в своем описании. Свойство не устанавливается из viewmodel, а из самого класса Properties. Это явно плохой дизайн, и я знаю это сейчас. Из любопытства, любая идея, почему это не работает? – ganjeii

+0

Я создавал экземпляр класса Properties из usercontrol внутри MainWindow. Затем вызовите метод внутри класса свойств, чтобы изменить значение Result. Но кнопки являются частью MainWindow и NOT usercontrol. Я уверен, что это тоже плохой дизайн, но я хочу, чтобы кнопки оставались статичными, когда я переключаюсь между usercontrols (разные виды). – ganjeii