Переключение стиля в StyleSelector на основе связанного значения вместо фиксированного свойства ViewModel - PullRequest
0 голосов
/ 28 марта 2020

У меня есть GridView, где столбцы могут быть связаны с числовыми значениями c. Я использую его для переключения стиля на основе значения модели представления. Т.е. если оно отрицательное, я хочу отображать красный, если оно положительное, то оно должно отображаться черным, а если оно равно 0, я вообще не хочу отображать значение.

Моя проблема связана с возможностью повторного использования StyleSelector

public class AmountStyleSelector : StyleSelector 
{
   public override Style SelectStyle(object item, DependencyObject container)
   {

      if (!(item is TransactionVm tran))
         return null;

      var header = ((GridViewBoundColumnBase)((GridViewCellBase)container).Column).Header;

      Style Local(decimal value)
      {
         if (value == 0) return Empty;   
         return value <= 0 ? Negative : Positive;
      }

      // OMG what, surely there is a better way, 
      // other than switch on the column header name?
      return header switch
         {
            "Debit" => Local(tran.Amount.Debit),
            "Credit" => Local(tran.Amount.Credit),
            "Total" => Local(tran.Amount.Total),
            "Balance" => Local(tran.Amount.Balance),
            _ => Positive
         };
   } 

   public Style Negative { get; set; }
   public Style Positive { get; set; }
   public Style Empty { get; set; } 
}

. Как вы можете видеть, это жестко связано с именем столбца, чтобы выбрать значение модели представления (которое на самом деле является связанное значение).

Есть ли способ вместо этого работать с фактическим значением привязки?

Игнорируя здесь визуальное дерево, было бы неплохо сделать что-то подобное ...

var column = ((GridViewBoundColumnBase)((GridViewCellBase)container).Column);
var value = column.BindingProperty.GetActualTrueToGodBoundValue();

1 Ответ

0 голосов
/ 28 марта 2020

, где столбцы могут быть связаны с числовыми значениями c. Я использую его для переключения стиля на основе значения модели представления.

Я не могу говорить с вашим текущим дизайном, но когда необходимо изменить элементы, такие как видимость, isEnabled и цвета ... почему бы не сделать мульти-сборку с целевым значением и использовать конвертер, который будет принимать в 1 ко многим предметам и вернуть цвет / bru sh?

Кажется, что текущий дизайн закодировал вас в пресловутую дыру. Стиль по большей части должен использоваться для предоставления структуры видимому представлению, в то время как специфика этого представления может быть изменена с помощью преобразователей или триггеров данных; полное изменение стиля ( вида ) для одного изменения цвета .

Упростите ваш дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...