簡體   English   中英

根據綁定值而不是固定的 ViewModel 屬性在 StyleSelector 中切換樣式

[英]Switch style in StyleSelector based on bound value instead of fixed ViewModel Property

我有一個GridView ,其中的列可以綁定到數值。 我使用它根據視圖模型值切換樣式。 即如果它是負數,我想顯示紅色,如果它是正數,那么它應該顯示黑色,如果它是 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();

其中列可以綁定到數值。 我使用它根據視圖模型值切換樣式。

我無法談論您當前的設計,但是當需要更改可見性、isEnabled 和顏色等項目時... /刷子?

似乎當前的設計已將您編碼到眾所周知的漏洞中。 大多數情況下應該使用樣式來為可見視圖提供結構,而該視圖的細節可以使用轉換器或數據觸發器進行更改; 不會因為一種顏色變化而完全改變整個風格(視圖的)。

簡化您的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM