C# 使用INotifyPropertyChanged进行绑定
在我的项目中,每当出现新的投标价格时,我想改变Datagrid单元的背景。 我用C# 使用INotifyPropertyChanged进行绑定,c#,wpf,xaml,inotifypropertychanged,C#,Wpf,Xaml,Inotifypropertychanged,在我的项目中,每当出现新的投标价格时,我想改变Datagrid单元的背景。 我用 public class Notifier : INotifyPropertyChanged { public bool BidUp { get { return _bidUp; } set { _bidUp = value; OnPropertyChanged("BidUp"); } } public double Bid { get { r
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。如果\u bidUp=value
不改变,有没有办法触发一个改变?我想问一下,如果调用了
属性a=somevalue
,如果相同的值适用,为什么不调用OnPropertyChanged
?考虑绑定到一个表示实际值的属性,然后使用多重绑定(即currentValue和previousValue)来更新您的UI。您有两种方法可以触发同一个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
}
}
还是
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
}
}
你能在这里添加你的XAML代码吗?@FaisalHafeez补充道,但是XAML在这里不相关。你是从
INotifyPropertyChanged
继承的吗?你能发布它的实现代码吗,以及OnNotifyPropertyChanged
?你需要有一个实现INotifyPropertyChanged
接口的类,并在该类中定义你的属性谢谢你的快速回答。我会用第一种方法。先生,你能再看一看吗?事实上我发现了OnPropertyChanged(“Bid”);OnPropertyChanged(“Bid”)
无助于解决问题。如果BidUp=true
后接另一个出价上涨,则通知不会发生。当属性为true时,相同的情况会变为false后接false,然后再次变为true,从技术上讲,它不会改变值,因此我不希望发生属性更改事件。@Hans但从技术上讲,是even对于相同的值,set访问器=value
应该可以工作?有什么办法解决这个问题吗?我没有两次通知“Bid”。一个通知是“Bid”,另一个是“BidUp”无论如何,@Hans说的是正确的,他说属性没有改变,因此不需要UI更新。或者,对一个新属性进行单个绑定
,表示上一个和新的Bid
值之间的增量,例如,BidChange
@MikeStrobel,出于同样的原因BidChange
也不会起作用rk如果投标变更是0.1
,然后是另一个0.1
;我需要一些方法来强制通知检测变更。