1
<DataGrid....
<DataGrid.Resources>
  <DataTemplate DataType="{x:Type DateTime}">
        <TextBlock Text="{Binding StringFormat={}{0:d}}"  />
  </DataTemplate>
</DataGrid.Resources>
...
 <DataGridTemplateColumn Header="Время оплаты">
    <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
                <TextBlock VerticalAlignment="Center" Text="{Binding date_payment}"  Width="Auto" Height="Auto" />
           </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

しかし、この列には型があります...この型(文字列)でこの列を変換する必要があります。この列の値行の名前を変更する必要があるためDateTime、イベントを使用しますLoadingRow

DataRowView item = e.Row.Item as DataRowView;
DataRow row = item.Row;
var time = row[4];
if (Convert.ToString(time) == "01.01.0001 0:00:00")
{
   row[4] = "No payment";
}

しかし、それは間違っています。行は文字列に変換されません。助けてください

4

3 に答える 3

3

まず、セルテンプレートとデータテンプレートの両方があります。一つを選ぶ。第二に、とにかくデータテンプレートがあるので、コンバーターを作成する理由はありません。ましてや、コードビハインドイベントハンドラーです。関連するすべてのコードとテキスト文字列(ローカライズする必要がある場合はどうなりますか?)をトリガーを使用して1か所に適切に保持できます。

<DataTemplate TargetType="{x:Type DateTime}">
  <TextBlock x:Name="text" Text="{Binding StringFormat={}{0:d}}"/>
  <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding}" Value="{x:Static DateTime.MinValue}">
      <Setter TargetName="text" Property="Text" Value="No payment"/>
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>
于 2012-07-13T10:23:14.573 に答える
2

Nullable値の場合は、次を使用できます

Binding="{Binding date_payment, TargetNullValue={}Дата отсутствует}"

そうでない場合は、MinDateをチェックするIValueConverterを使用してください。コンバーターの使用方法の例と、コンバーターを次に示します。

public class DateConverter:IValueConverter
{
    private const string NoDate = "Дата отсутствует";
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is DateTime)
        {
            var date = (DateTime) value;
            if(date==DateTime.MinValue)
                return NoDate;
            return date.ToString();
        }
        return NoDate;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-07-13T10:08:59.160 に答える
1

これには Converter を使用する必要があります。

public class MyConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            if (value == DateTime.MinValue) {
                return "No payment";
            }
            return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            throw new NotImplementedException();
        }
    }

バインディングにコンバーターを追加するだけではありません。

于 2012-07-13T10:01:33.083 に答える