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
支持字段。
您好 :) 我正在尝试弄清楚 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
支持字段。