[英]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.