嗨:)我正在试图弄清楚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。谢谢:))
答案 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
支持字段。