在WPF DataGrid中进行计算

时间:2018-08-07 11:31:06

标签: c# wpf datagrid

我有一个自定义类型的集合,该集合已插入到数据网格中。 datagrid显示了该类型的各种属性,但是我想在datagrid中包括一些“动态”列,这些列是对其他列的计算。

例如,这是我的数据网格:

<DataGrid Margin="5, 15" Background="White" ItemsSource="{Binding StandardTrades}" SelectedItem="{Binding SelectedStandardTrade}" CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False" materialDesign:DataGridAssist.CellPadding="13 20 8 8" materialDesign:DataGridAssist.ColumnHeaderPadding="8">
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="true" Binding="{Binding TradeDate, StringFormat={}{0:dd/MM/yyyy}}" Header="Trade Date" EditingElementStyle="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}" />
        <DataGridTextColumn IsReadOnly="true" Header="Client" Binding="{Binding Exchange.Client.Name}" />
        <DataGridTextColumn IsReadOnly="true" Header="Clearer" Binding="{Binding Exchange.Clearer.Name}" />
        <DataGridTextColumn IsReadOnly="true" Header="Exchange" Binding="{Binding Exchange.ExchangeCode}" />
        <DataGridTextColumn IsReadOnly="true" Header="CCY" Binding="{Binding Exchange.Currency.Code}" />
        <DataGridTextColumn IsReadOnly="true" Header="B/S" Binding="{Binding BOrS}" />
        <DataGridTextColumn IsReadOnly="true" Header="Product" Binding="{Binding Product}" />
        <DataGridTextColumn IsReadOnly="true" Header="Volume" Binding="{Binding Volume}" />
        <DataGridTextColumn IsReadOnly="true" Header="Maturity" Binding="{Binding Maturity}" />
        <DataGridTextColumn IsReadOnly="true" Header="Reference" Binding="{Binding Reference}" />
        <DataGridTextColumn IsReadOnly="true" Header="Price" Binding="{Binding Price}" />
        <DataGridTextColumn IsReadOnly="true" Header="Rate" Binding="{Binding Exchange.Rate}" />
        <DataGridTextColumn IsReadOnly="true" Header="Commission total" Binding="{Binding Exchange.Rate * Exchange.Volume}" />
    </DataGrid.Columns>
</DataGrid>

如您所见,在最后一列上,我想生成一个计算Rate * Volume的输出。

我将如何去做?我不确定之前如何使用转换器,所以如果我需要使用转换器,有人可以告诉我如何使用吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

好,感谢Greg向我展示了多绑定转换器,直到今天我才发现它们。

这就是我提出解决方案的方式。

我创建了一个新的转换器类:

public class AddConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        decimal result = int.Parse(values[0].ToString()) * decimal.Parse(values[1].ToString());
        return result.ToString(CultureInfo.InvariantCulture);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Convert方法将第一个参数作为一个整数,将第二个参数作为一个十进制,以计算总佣金。

然后我将其插入到我的XAML代码中,首先确保将转换器包含为类的资源:

<UserControl.Resources>
    <converters:AddConverter x:Key="AddConvertor"/>
</UserControl.Resources>

然后最后在datagrid中实现它:

<DataGridTextColumn IsReadOnly="true" Header="Commission total">
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource AddConvertor}">
            <Binding Path="Volume" />
            <Binding Path="Exchange.Rate" />
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>