DataGrid 綁定實體集合 List<User>,實體含 CurrentMoney、PayMoney,需顯示第三列 CurrentMoney - PayMoney,實體無此屬性。
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();
}
}
<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,保持實體純粹。