Значение списка ссылок в Elementstyle - PullRequest
0 голосов
/ 13 марта 2012

после того, как я нашел большую помощь по stackoverflow, я теперь борюсь с проблемой, для которой пока не могу найти ответ. Моя цель заключается в следующем:

У меня есть таблица данных в приложении wpf / c #, заполненная цифрами. В зависимости от того, является ли фигура положительной или отрицательной, я хочу изменить шрифт переднего плана на зеленый или красный. Источником предметов для сетки данных является список моего собственного класса, который включает следующие элементы:

  • описание строки
  • список из 12 парных чисел под названием totalMoney

Я вручную сконфигурировал столбцы для сетки данных так, чтобы сначала отображалось описание, затем значение totalMoney [0], затем totalMoney [1] и так далее. После некоторых поисков я нашел способ изменить цвет переднего плана отдельных ячеек, основываясь на значениях здесь, на стековом потоке, через метод datatrigger плюс IValueConverter со следующим кодом:

<DataGridTextColumn.ElementStyle>
    <Style TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="1">
                <Setter Property="Foreground" Value="Green"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="0">
                <Setter Property="Foreground" Value="Black"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding totalMoney[2], Converter={StaticResource money}}" Value="-1">
                <Setter Property="Foreground" Value="Red"/>
            </DataTrigger>
         </Style.Triggers>
     </Style>
 </DataGridTextColumn.ElementStyle>

Однако, как вы видите в коде, в WPF я должен ссылаться на привязку к отдельному элементу в моем списке (totalMoney [X]). Поэтому мне нужно вручную установить стиль для каждого столбца в моей сетке данных. Поскольку я хочу использовать этот стиль в нескольких сетях передачи данных, это кажется мне крайне непрактичным.

Поэтому мой вопрос - возможно ли определить стиль так, чтобы он менялся в зависимости от значения ячейки в целом? Или, может быть, есть совершенно другой способ достижения моей цели, который я упустил из виду?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 13 марта 2012

На первый взгляд, вы можете использовать следующий стиль для всех столбцов totalMoney [] ...

    <Style TargetType="{x:Type TextBlock}" x:Key="MoneyIndicatorStyle">
        <Style.Triggers>
            <DataTrigger
                   Binding="{Binding Text, RelativeSource={RelativeSource Self},
                                     Converter={StaticResource money}}"
                   Value="1">
                <Setter Property="Foreground" Value="Green"/>
            </DataTrigger>
            <DataTrigger
                   Binding="{Binding Text, RelativeSource={RelativeSource Self},
                                     Converter={StaticResource money}}"
                   Value="0">
                <Setter Property="Foreground" Value="Black"/>
            </DataTrigger>
            <DataTrigger
                   Binding="{Binding Text, RelativeSource={RelativeSource Self},
                                     Converter={StaticResource money}}"
                   Value="-1">
                <Setter Property="Foreground" Value="Red"/>
            </DataTrigger>
         </Style.Triggers>
     </Style>

Но здесь потенциальный улов ... если завтра вы решитечто текст этих текстовых блоков будет отформатированной валютой, подобной этой ... $ (1,00) то есть отрицательные 100 долларов в мире бухгалтерского учета, тогда преобразователю может потребоваться преобразовать эту отформатированную строку вЧисло, не зависящее от локали, то есть -100.00 и выход 0, 1 или -1 в зависимости от текущей логики в конвертере.

В данный момент ваш конвертер чувствует себя непринужденно, поскольку получает прямое числовое значение (totlaMoney [n]) отВаша модель, но с использованием вышеуказанного стиля, она будет полагаться на Text, отображаемый Textblock!

Так что решение за вами.

...