Я новичок в WPF, поэтому в настоящее время довольно запутался в этой концепции. У меня есть биржевая программа, в которой я хочу изменить передний цвет этой ячейки в зависимости от того, поднялась или снизилась цена акции.

Это мой текущий код (пропущено несколько вещей):

public class Stock : INotifyPropertyChanged
{
    public Stock()
    {
        DaysLow = 0;
        DaysHigh = 0;
    }

    public List<string[]> StockInformation = new List<string[]>();

    public string Symbol { get; set; }

    private double _Bid;
    public double Bid
    {
        get { return _Bid; }
        set
        {
            // If _Bid < value, change fore color
            _Bid = value;
            DisplayCurrentPrice = String.Format("{0} / {1}", value, Ask);

        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

    public override string ToString()
    {
        return Symbol;
    }
}

XAML:

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Height" Value="26" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="Symbol" DisplayMemberBinding="{Binding Path=Symbol}" Width="120" />
                <GridViewColumn Header="Bid / Ask" DisplayMemberBinding="{Binding Path=DisplayCurrentPrice}" Width="125" />
                <GridViewColumn Header="D.High" DisplayMemberBinding="{Binding Path=DaysHigh}" Width="75" />
                <GridViewColumn Header="D.Low" DisplayMemberBinding="{Binding Path=DaysLow}" Width="75" />
                <GridViewColumn Header="Year Low/High" DisplayMemberBinding="{Binding Path=DisplayYearPrice}" Width="100" />
            </GridView>
        </ListView.View>
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Details" Click="CM_Details_Click"></MenuItem>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>

Итак, что я могу сделать здесь, чтобы достичь того, чего я ищу? Любая помощь приветствуется, спасибо!

0
JohnC1 26 Дек 2013 в 21:52

2 ответа

Лучший ответ

Вот как я бы представил свой класс StockModel:

class StockModel : INotifyPropertyChanged
{
    // NOTE: You must implement PropertyChanged notification for these properties...
    public string Symbol { get; set; }
    public decimal Bid { get; set; }
    public decimal Delta { get; set; }  // Change in price over time, +/-

    // Any additional properties you may want here...
}

Теперь красота WPF заключается в следующем: IValueConverter классы. Эти классы позволяют «преобразовывать» значения из одного типа в другой, используя предоставленную вами логику.

В нашем случае мы хотим привязать цвет ListViewItem.Foreground к значению StockModel.Delta. Положительные ненулевые значения дельты должны давать нам Green, а отрицательные ненулевые значения дельты должны давать нам Red. Ноль может оставаться Black или White (в зависимости от контрастности вашей темы).

Так как же нам этого добиться? Нам нужно создать класс StockColorConverter, реализующий IValueConverter:

sealed class StockColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Convert a delta value to a brush color.
        var deltaValue = System.Convert.ToDecimal(value);

        if (deltaValue > 0)
            return Brushes.Green;       // Positive
        else if (deltaValue < 0)
            return Brushes.Red;         // Negative 
        else
            return Brushes.Black;       // Zero
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // We can't convert a color to a delta value! This will never be used anyhow.
        throw new NotSupportedException();
    }
}

Теперь вам нужно будет правильно подключить это в XAML. Итак, сначала предположим, что вы делаете это в своем файле MainWindow.xaml. Вам нужно будет добавить пространство имен вашего проекта после существующих:

xmlns:my="clr-namespace:WpfApplication1"

Затем создайте (или добавьте) Window.Resources:

<Window.Resources>
    <my:StockColorConverter x:Key="StockColorConverter"/>
</Window.Resources>

Намного проще использовать DataTemplate для обработки макета ваших ListViewItem. DataTemplate определяет, как должен отображаться каждый элемент и что должно отображаться:

        <ListView.ItemTemplate>
            <!-- These are StockModel objects as our data! -->
            <DataTemplate>
                <TextBlock Text="{Binding Symbol}"
                           Foreground="{Binding Delta, Converter={StaticResource StockColorConverter}}"/>
            </DataTemplate>
        </ListView.ItemTemplate>

Как видите, мы привязываем TextBlock.Foreground к StockModel.Delta. Обычно это не работает, поскольку decimal не эквивалентен объекту Brush. Однако, используя созданный нами StockColorConverter, мы можем легко применить условное форматирование.

1
Erik 26 Дек 2013 в 19:55

Вы можете добавить это в свой С #

public bool ChangeColor {get; set;}

private double _Bid;
public double Bid
{
    get { return _Bid; }
    set
    {
         If (_Bid < value)//, change fore color
              ChangeColor = True;
        _Bid = value;
        DisplayCurrentPrice = String.Format("{0} / {1}", value, Ask);

    }
}

Тогда в xaml

       <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Height" Value="26" />
                <Style.Triggers>
                   <DataTrigger Binding="{Binding Path=ChangeColor}" Value="True">
                      <Setter Property="ForeColor" Value="Red"/>
                   </DataTrigger >
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
0
DROP TABLE users 26 Дек 2013 в 18:00