使用INotifyPropertyChanged进行绑定 [英] Binding using INotifyPropertyChanged
问题描述
在我的项目中,无论何时出现新的出价,我都想更改Datagrid单元格的背景. 然后使用
进行设置public class Notifier : INotifyPropertyChanged
{
public bool BidUp
{
get { return _bidUp; }
set
{
_bidUp = value;
OnPropertyChanged("BidUp");
}
}
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged("Bid");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
还有我的DataGridCell的xaml代码:
<DataTemplate>
<Border x:Name="BidBoder" Background="AliceBlue" BorderThickness="0">
<TextBlock Text="{Binding Bid}" x:Name="BidTextBlock" HorizontalAlignment="Right"></TextBlock>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding BidUp}" Value="True">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="bidUpStoryboard"/>
<StopStoryboard BeginStoryboardName="bidDownStoryboard"/>
<BeginStoryboard Name="bidUpStoryboard">
<Storyboard BeginTime="00:00:00">
<ColorAnimation
BeginTime="00:00:00"
Duration="0:0:0.1"
To="LimeGreen"
AutoReverse="True"
Storyboard.TargetName="BidBoder"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding BidUp}" Value="False">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="bidUpStoryboard"/>
<StopStoryboard BeginStoryboardName="bidDownStoryboard"/>
<BeginStoryboard Name="bidDownStoryboard">
<Storyboard BeginTime="00:00:00">
<ColorAnimation
BeginTime="00:00:00"
Duration="0:0:0.1"
To="Red"
AutoReverse="True"
Storyboard.TargetName="BidBoder"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
现在发生的事情是,如果价格先上涨又上涨,BidUp = true--->true
propertyChanged不会触发.
我想问一问是否调用了Property A = somevalue
,为什么要应用OnPropertyChanged
呢?
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged(null); // notify change of EVERY property - good if few properties in ViewModel
}
}
如果相同的值适用,为什么不调用OnPropertyChanged
呢?
您可以通过两种方式触发同一设置程序中多个属性的更新:
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged("Bid");
OnPropertyChanged("BidUp"); // notify both properties in the same setter
}
}
还是
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged(null); // notify change of EVERY property - good if few properties in ViewModel
}
}
In my project I wanna change the background of a Datagrid cell whenever a new Bid price comes in. And I set it using
public class Notifier : INotifyPropertyChanged
{
public bool BidUp
{
get { return _bidUp; }
set
{
_bidUp = value;
OnPropertyChanged("BidUp");
}
}
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged("Bid");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
And my xaml code for the DataGridCell:
<DataTemplate>
<Border x:Name="BidBoder" Background="AliceBlue" BorderThickness="0">
<TextBlock Text="{Binding Bid}" x:Name="BidTextBlock" HorizontalAlignment="Right"></TextBlock>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding BidUp}" Value="True">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="bidUpStoryboard"/>
<StopStoryboard BeginStoryboardName="bidDownStoryboard"/>
<BeginStoryboard Name="bidUpStoryboard">
<Storyboard BeginTime="00:00:00">
<ColorAnimation
BeginTime="00:00:00"
Duration="0:0:0.1"
To="LimeGreen"
AutoReverse="True"
Storyboard.TargetName="BidBoder"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding BidUp}" Value="False">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="bidUpStoryboard"/>
<StopStoryboard BeginStoryboardName="bidDownStoryboard"/>
<BeginStoryboard Name="bidDownStoryboard">
<Storyboard BeginTime="00:00:00">
<ColorAnimation
BeginTime="00:00:00"
Duration="0:0:0.1"
To="Red"
AutoReverse="True"
Storyboard.TargetName="BidBoder"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
Now what happens is if price goes up followed by a up, BidUp = true--->true
the propertyChanged does not trigger. Is there a way to trigeer a change even the _bidUp = value
does not change?
And I wanna ask generally if Property A = somevalue
is called, why OnPropertyChanged
is not called if the same value applies?
You have two ways of triggering the update of more than one property in the same setter:
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged("Bid");
OnPropertyChanged("BidUp"); // notify both properties in the same setter
}
}
or yet
public double Bid
{
get { return _bid; }
set
{
BidUp = (value > this.Bid);
_bid = value;
OnPropertyChanged(null); // notify change of EVERY property - good if few properties in ViewModel
}
}
这篇关于使用INotifyPropertyChanged进行绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!