首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

WPF DataGrid 多值綁定:使用 MultiBinding 與 IMultiValueConverter 計算列差值

     編輯:程式設計疑難解答

場景

DataGrid 綁定實體集合 List<User>,實體含 CurrentMoney、PayMoney,需顯示第三列 CurrentMoney - PayMoney,實體無此屬性。

解決方案:MultiBinding + 轉換器

1. 實現 IMultiValueConverter

public class MoneyDiffConverter : IMultiValueConverter {
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        if (values.Length == 2 && values[0] is decimal && values[1] is decimal) {
            return (decimal)values[0] - (decimal)values[1];
        }
        return DependencyProperty.UnsetValue;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
        throw new NotSupportedException();
    }
}

2. XAML 註冊資源並綁定

<Window.Resources>
    <local:MoneyDiffConverter x:Key="MoneyDiffConverter"/>
</Window.Resources>

<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="當前金額" Binding="{Binding CurrentMoney}"/>
        <DataGridTextColumn Header="支付金額" Binding="{Binding PayMoney}"/>
        <DataGridTextColumn Header="餘額">
            <DataGridTextColumn.Binding>
                <MultiBinding Converter="{StaticResource MoneyDiffConverter}" StringFormat="F2">
                    <Binding Path="CurrentMoney"/>
                    <Binding Path="PayMoney"/>
                </MultiBinding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

替代方案對比

方案優點缺點
MultiBinding + Converter純 XAML,不污染實體,分離關注點需編寫轉換器類
實體添加只讀屬性 Balance簡單直觀實體屬性膨脹,業務邏輯滲透到模型
DataTable 動態列靈活類型安全差,性能稍低

建議

業務復雜、多界面復用時首選 MultiBinding,保持實體純粹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved