私はXMLDataProviderへのバインディングを持つDataGridを持っています。列 "時間"に列 "開始"と "終了"の時差を表示します。 2つのDataGrid列を計算し、その結果をWPFの3番目の列に表示するにはどうすればよいですか?
<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 [email protected]}" />
<DataGridTextColumn Header="Begin" Binding="{Binding [email protected]}" />
<DataGridTextColumn Header="End" Binding="{Binding [email protected]}" />
<DataGridTextColumn Header="Hours" Binding="{Binding Converter={local:HourConverter}}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
私は、いくつかのDateクラスに入れ、タイムズを取得し、IValueConverterを使用しての差を計算し、結果を返すことを試みました。残念ながら私はデータを取得することさえできません。
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;
}
}
いずれかのアイデアはありますか?
編集:
ありがとうございました!
私はそれを働かせました。私は1つのオブジェクトだけを取得するとき、値をEnumerable < XmlNode>として保存する必要はないことを忘れていますが、XmlNodeとしてのみ保存できます。次に、xml.Attributes ["Begin"]。innerTextをStringとして、値を ':'で分割します(時間はhh:mmのように保存されます)、新しいTimespanに解析して戻ります(timespan2 - timespan1)。 toString()。で、最後に
<DataGridTextColumn Header="Hours" Binding="{Binding Converter={StaticResource hourConverter}}" />
:
<Page
xmlns:converterPath="clr-namespace:MyProject.MyNamespace"
<Page.Resources>
<converterPath:HourConverter x:Key="hourConverter" />
</Page.Resources>
が次にあなたは、コンバータ、パラメータをバインドする必要があります。
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");
}
どのような意味ですか"私はデータを入手することさえできません"? - あなたはコンバータをデバッグしようとしましたか? – Fruchtzwerg
実際、このようなプロジェクトをビルドすると、NullPointerExceptionが発生します。私はWPFの経験がほとんどなく、他の列のデータを取得するためにIValueConverterを使用したプロジェクトを見てきました。 – Nikit
convertメソッドにブレークポイントを配置し、例外がスローされた場所を見つけようとします – Fruchtzwerg