2017-02-08 5 views
1

私は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"); 
    } 
+0

どのような意味ですか"私はデータを入手することさえできません"? - あなたはコンバータをデバッグしようとしましたか? – Fruchtzwerg

+0

実際、このようなプロジェクトをビルドすると、NullPointerExceptionが発生します。私はWPFの経験がほとんどなく、他の列のデータを取得するためにIValueConverterを使用したプロジェクトを見てきました。 – Nikit

+0

convertメソッドにブレークポイントを配置し、例外がスローされた場所を見つけようとします – Fruchtzwerg

答えて

0

まず、あなたのコンバーターへのリンクとリソースをバインドする必要がありあなたが返すコンバータnull表示したい定型の値を返す必要があります

関連する問題