【问题标题】:Binding using INotifyPropertyChanged使用 INotifyPropertyChanged 进行绑定
【发布时间】:2014-11-11 18:45:51
【问题描述】:

在我的项目中,每当有新的投标价格出现时,我想更改 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---&gt;true propertyChanged 不会触发。即使_bidUp = value 没有改变,有没有办法触发改变?
我想问一下如果Property A = somevalue 被调用,为什么OnPropertyChanged 不被调用,如果相同的值适用?

【问题讨论】:

  • 你能在这里添加你的 XAML 代码吗?,
  • @FaisalHafeez 已添加,但此处与 xaml 无关。
  • 你是从INotifyPropertyChanged继承的吗?你能发布它的实现代码吗?OnNotifyPropertyChanged
  • 您需要有一个实现INotifyPropertyChanged 接口的类并在该类中定义您的属性,然后它应该可以工作。

标签: c# wpf xaml inotifypropertychanged


【解决方案1】:

您有两种方法可以在同一个 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
    }
}

【讨论】:

  • 感谢您的快速答复。我将使用第一种方式。
  • 先生,您能再看看吗?实际上我发现OnPropertyChanged("Bid");OnPropertyChanged("Bid"); 无助于解决问题。如果BidUp = true 后跟另一个投标价格上涨,则不会发生通知。同样的情况下是假的,然后是假的
  • 当属性为真然后再次为真时,技术上它并没有改变值,所以我不希望发生属性更改事件。
  • @Hans 但从技术上讲,即使使用相同的值,设置访问器 = value 应该可以工作吗?任何想法如何解决这个问题?
  • 我没有两次通知“投标”。一个通知是针对“Bid”,另一个是针对“BidUp”。无论如何,@Hans 说属性没有改变是对的,因此不需要更新 UI。
【解决方案2】:

考虑绑定到代表实际值的属性,然后使用多重绑定(即 currentValue 和 previousValue)来更新您的 UI。

【讨论】:

  • 或者,单个Binding 与一个新属性对应,该属性表示先前和新Bid 值之间的增量,例如BidChange
  • @MikeStrobel 出于同样的原因,如果出价更改为0.1 后跟另一个0.1,则BidChange 将不起作用;我需要一些方法来强制通知检测更改。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2023-03-13
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多