更新属性后,WPF PropertyChanged事件为null

时间:2016-12-23 14:09:28

标签: wpf data-binding inotifypropertychanged updating

我正在努力进行一些数据绑定。在我的MainWindow中,我有两个按钮,它们在“属性”类中数据绑定到属性Result - 严格来说,用于保存我将用于数据绑定的属性。默认情况下隐藏按钮,当我希望它们变得可见时,我只需将它们绑定的Result属性设置为“True”

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

所以他们被绑定到“Result”属性,我的绑定中有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中而只是在一个单独的类中?

1 个答案:

答案 0 :(得分: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>