INotifyPropertyChanged,事件始终为null

时间:2016-03-24 23:39:31

标签: c# handler inotifypropertychanged

嗨:)我正在试图弄清楚INotifyPropertyChanged如何与一个非常基本的应用程序一起工作。我只是在我的mainWindow中有一个按钮,当你按下它时,它应该触发一个事件来更新一个已绑定到特定属性的textBox。但是,即使事件被触发,它们也始终为null,因此textBox不会更新。

<Window x:Class="StockViewer.MainWindow"
    <!--Just erased some basic xaml here-->
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <local:RandomGen/>
</Window.DataContext>

<Grid>
    <Button Click="incr" Height="30" VerticalAlignment="Top" Background="DarkGoldenrod"></Button>
    <TextBlock VerticalAlignment="Top" Margin="40" Text="{Binding price, UpdateSourceTrigger=PropertyChanged}" Background="Aqua"></TextBlock>
</Grid>

按下按钮时,价格应该改变:

public partial class MainWindow : Window
{
    private RandomGen gen;
    public MainWindow()
    {
        gen = new RandomGen();          
        InitializeComponent();
    }
    private void incr(object sender, RoutedEventArgs e)
    {
        gen.price = 7;
    }
}

class RandomGen : NotifiedImp
    {
     public RandomGen()
        {
            _i = 3;
        }
        private int _i;

        public int price
        {
            get { return _i; }
            set
            {
                _i = value;
                OnPropertyChanged("price");
            }
        }
    }

class NotifiedImp: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;        
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this,new PropertyChangedEventArgs(propertyName));
            }   
        }
    }

这真的很奇怪,处理程序始终为null。谢谢:))

1 个答案:

答案 0 :(得分:2)

您有两个RandomGen个实例,其中一个在您的XAML中初始化:

<Window.DataContext>
     <local:RandomGen/>
</Window.DataContext>

另一个在MainWindow构造函数中初始化:

gen = new RandomGen();

这意味着当您更新gen.price = 7;时,您不会更新您的DataContext实例。

一种解决方案是删除XAML中的<Window.DataContext>设置,并在DataContext构造函数中设置MainWindow,如下所示:

public MainWindow()
{
    gen = new RandomGen();          
    InitializeComponent();
    DataContext = gen;
}

最类似MVVM的解决方案是使用ICommand对象上的RandomGen更新price而不是使用事件处理程序,然后在XAML中使用此命令,如:

<Button Command="{Binding IncrementPriceCommand}"></Button>

然后由您决定如何初始化DataContext,您不需要以任何方式保留RandomGen支持字段。