【发布时间】: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