2

我正在尝试获取一个标签以在其绑定的值发生更改时更改背景颜色。如果它上升,则暂时闪烁绿色。如果它下降,则暂时闪烁红色。

当我启动应用程序时,我遇到了这些问题:

  • 大多数情况下,标签会对其颜色进行少量动画处理,然后停止并不再更改
  • 有时标签只是移动到红色或绿色并停留在上面,无论输入值如何
  • 如果出价下降,点差会增加,但所有 3 个标签都动画为相同的颜色(如果动画有效)

任何人都可以看看这有什么问题,并评论一个更好的方法来构建它吗?我想知道是否有更好的方法来确定价值是上升还是下降,而不需要 ViewModel 上的 6 个属性来进行出价、询价和价差?我还想知道它是否取决于非常频繁的值变化(比如每秒 5+)?

谢谢。


看法

<Window x:Class="TestApp.UI.View.QuoteView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="QuoteView" Height="300" Width="300">
    <Window.Resources>
        <Style x:Key="BidStyle">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=BidHigher}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=BidLower}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=AskHigher}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=AskLower}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=SpreadHigher}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=SpreadLower}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Label Content="Bid" HorizontalAlignment="Left" Margin="21,10,0,0" VerticalAlignment="Top" />
        <Label Content="Ask" HorizontalAlignment="Left" Margin="19,53,0,0" VerticalAlignment="Top"/>
        <Label Content="Spread" HorizontalAlignment="Left" Margin="19,99,0,0" VerticalAlignment="Top"/>
        <Label x:Name="BidLabel" HorizontalAlignment="Left" Margin="102,10,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.Bid}" Style="{StaticResource ResourceKey=BidStyle}"/>
        <Label x:Name="AskLabel" HorizontalAlignment="Left" Margin="102,53,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.Ask}" Style="{StaticResource ResourceKey=BidStyle}"/>
        <Label x:Name="SpreadLabel" HorizontalAlignment="Left" Margin="102,99,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.BidAskSpread}" Style="{StaticResource ResourceKey=BidStyle}"/>
    </Grid>
</Window>

视图模型

public class QuoteViewModel : ViewModelBase
{
    private readonly FakeDataGenerator _dataGenerator;
    private Quote _quote;
    private bool _bidHigher;
    private bool _bidLower;
    private bool _askHigher;
    private bool _askLower;
    private bool _spreadHigher;
    private bool _spreadLower;

    public QuoteViewModel()
    {
        _dataGenerator = new FakeDataGenerator();
        _dataGenerator.NewQuoteEvent += DataGeneratorOnNewQuoteEvent;
    }

    private void DataGeneratorOnNewQuoteEvent(Quote quote)
    {
        Quote = quote;
    }

    public Quote Quote
    {
        get { return _quote; }
        set 
        {
            if (_quote != value)
            {
                UpdateQuoteComparisons(_quote, value);
                _quote = value;
                OnPropertyChanged("Quote");
            }
        }
    }

    private void UpdateQuoteComparisons(Quote existingQuote, Quote newQuote)
    {
        if(existingQuote == null)
        {
            return;
        }

        if (newQuote.Bid > existingQuote.Bid)
        {
            BidHigher = true;
        }
        else if (newQuote.Bid < existingQuote.Bid)
        {
            BidLower = true;
        }

        if (newQuote.Ask > existingQuote.Ask)
        {
            AskHigher = true;
        }
        else if (newQuote.Ask < existingQuote.Ask)
        {
            AskLower = true;
        }

        if (newQuote.BidAskSpread > existingQuote.BidAskSpread)
        {
            SpreadHigher = true;
        }
        else if (newQuote.BidAskSpread < existingQuote.BidAskSpread)
        {
            SpreadLower = true;
        }
    }

    public bool BidHigher
    {
        get { return _bidHigher; }
        set
        {
            _bidHigher = value;
            OnPropertyChanged("BidHigher");
        }
    }

    public bool BidLower
    {
        get { return _bidLower; }
        set
        {
            _bidLower = value;
            OnPropertyChanged("BidLower");
        }
    }

    public bool AskHigher
    {
        get { return _askHigher; }
        set
        {
            _askHigher = value;
            OnPropertyChanged("AskHigher");
        }
    }

    public bool AskLower
    {
        get { return _askLower; }
        set
        {
            _askLower = value;
            OnPropertyChanged("AskLower");
        }
    }

    public bool SpreadHigher
    {
        get { return _spreadHigher; }
        set
        {
            _spreadHigher = value;
            OnPropertyChanged("SpreadHigher");
        }
    }

    public bool SpreadLower
    {
        get { return _spreadLower; }
        set
        {
            _spreadLower = value;
            OnPropertyChanged("SpreadLower");
        }
    }
}
4

1 回答 1

2

您可以尝试通过 DataTrigger.ExitActions 停止情节提要(您必须将现有的 BeginStoryboard 命名为):

        <DataTrigger Binding="{Binding Path=SpreadLower}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Name="SpreadLowerStoryboard>
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <StopStoryboard BeginStoryboardName="SpreadLowerStoryboard" />
            </DataTrigger.ExitActions>
        </DataTrigger>
于 2012-10-04T14:34:07.670 回答