INotifyPropertyChanged,事件始终为空

INotifyPropertyChanged, event always null

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

<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));
            }   
        }
    }

真奇怪,处理程序总是空的。谢谢:)

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

中初始化
<Window.DataContext>
     <local:RandomGen/>
</Window.DataContext>

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

gen = new RandomGen();

这意味着当您更新 gen.price = 7; 时,您并没有更新您的 DataContext.

实例

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

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

最像 MVVM 的解决方案是在 RandomGen 对象上使用 ICommand 来更新 price 而不是使用事件处理程序,然后在 XAML,喜欢:

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

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