2016-12-23 41 views
1

我正在努力与一些数据绑定。在我的MainWindow中,我有2个按钮,这些按钮是数据绑定到属性Result的“属性”类 - 严格用于保存将用于数据绑定的属性。这些按钮默认是隐藏的,当我希望它们变得可见时,我简单地将它们绑定到的属性设置为“真”更新属性后WPF PropertyChanged事件为空

我知道数据绑定正在工作,因为如果我将该属性设置为静态值,这些按钮是可见/不可见的。请参阅下面我的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

在我的“属性”类我有下面和我实现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

谢谢j现在就试一试。我会更新与resutls – ganjeii

+0

这工程!谢谢! – ganjeii

回答

1

确保您已将窗口的DataContext设置为您的Properties类的实例,并且您没有将StackPanel的任何父元素的DataContext属性设置为其他内容,因为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

我正在从MainWindow中的usercontrol实例化Properties类。然后调用属性类中的方法来更改结果值。但按钮是MainWindow的一部分,而不是用户控件。我很确定这也是糟糕的设计,但我希望按钮在用户控件(不同视图)之间切换时保持静态。 – ganjeii

相关问题