C# 使用INotifyPropertyChanged进行绑定

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

在我的项目中,每当出现新的投标价格时,我想改变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。如果
\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
;我需要一些方法来强制通知检测变更。