【问题标题】:How do I calculate two DataGrid columns and show the result in a third column in WPF?如何计算两个 DataGrid 列并将结果显示在 WPF 的第三列中?
【发布时间】:2017-06-26 05:50:53
【问题描述】:

我有一个绑定到 XMLDataProvider 的 DataGrid。我希望“小时”列显示“开始”和“结束”列之间的时间差。

    <Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" VerticalAlignment="Top" HorizontalAlignment="Left">
        <DataGrid Name="workinghours" ItemsSource="{Binding XPath=WorkTime}" ColumnHeaderStyle="{StaticResource columnHeaderStyle}" AutoGenerateColumns="False" RowHeaderWidth="0" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Day" Binding="{Binding XPath=@Day}"  />
                <DataGridTextColumn Header="Begin" Binding="{Binding XPath=@Begin}" />
                <DataGridTextColumn Header="End" Binding="{Binding XPath=@End}" />
                <DataGridTextColumn Header="Hours" Binding="{Binding Converter={local:HourConverter}}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

我尝试使用 IValueConverter,获取 Times,将其放入某个 Date 类中,计算差异并返回结果。不幸的是,我什至无法获取数据。

 public class HourConverter : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return 0;

        var xml = value as IEnumerable<XmlNode>;
        var von = xml.Select(x => x.Attributes["Begin"].Value);
        var bis = xml.Select(x => x.Attributes["End"].Value);
        // save into some date object, calculate the hours between, return the amount

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

有什么想法吗?

编辑:

感谢所有回答!

我让它工作了。我忘记了,当我只得到一个对象时,我不需要(不能)将值保存为 Enumerable ,而只保存为 XmlNode。然后我将 xml.Attributes["Begin"].innerText 的值作为字符串,将其拆分为 ':'(时间像 hh:mm 一样保存),将其解析为新的 Timespan 并返回(timespan2 - timespan1)。 toString().

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return 0;

        var xml = value as XmlNode;
        var von = xml.Attributes["Begin"].InnerText;
        var bis = xml.Attributes["End"].InnerText;
        string[] ar1 = von.Split(':');
        string[] ar2 = bis.Split(':');
        TimeSpan t1 = new TimeSpan(Int32.Parse(ar1[0]), Int32.Parse(ar1[1]), 0);
        TimeSpan t2 = new TimeSpan(Int32.Parse(ar2[0]), Int32.Parse(ar2[1]), 0);


        return (t2 - t1).ToString(@"hh\:mm");
    }

【问题讨论】:

  • “我什至无法获取数据”是什么意思? - 你试过调试转换器吗?
  • 实际上,当我像这样构建项目时,我得到了 NullPointerException。我对 WPF 的经验很少,并且看过一个项目,其中有人使用 IValueConverter 来获取其他列的数据。
  • 尝试在convert方法下下断点,找出抛出异常的地方
  • 你把转换器注册为资源了吗?这是转换器的堆栈文档页面,有示例:stackoverflow.com/documentation/wpf/3950/… 另外,在您的情况下,IMultiValueConverter 可能会更简单。
  • 第一个 xml.Select 抛出异常。 value 包含 {Element, Name="WorkTime"} 应该是正确的,var xml 保持为空。

标签: c# xml wpf data-binding datagrid


【解决方案1】:

首先,您必须将资源与转换器的链接绑定:

<Page
    xmlns:converterPath="clr-namespace:MyProject.MyNamespace"
<Page.Resources>
    <converterPath:HourConverter x:Key="hourConverter" />
</Page.Resources>

然后你必须绑定转换器和一个参数:

<DataGridTextColumn Header="Hours" Binding="{Binding Converter={StaticResource hourConverter}}" />

最后,在您返回 null 的转换器中,您必须返回要显示的格式化值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2014-08-01
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多