Comment puis-je obtenir la date uniquement hors du sélecteur de date dans WPF ?

la programmation


J’ai un DatePicker permettant à l’utilisateur de sélectionner manuellement une date, et cette date entre comme valeur pour un élément sélectionné dans ma grille de données.

cependant, il s’affiche par exemple sous la forme « 23/01/2023 00:00:00 AM ».
Je veux qu’il soit affiché comme « 23/01/2023 ».

J’ai mon code comme suit :

    public partial class Shortlist : Window
    {
     
//        public ObservableCollection<ShortlistedClient> shlclients { get; set; } = new ObservableCollection<ShortlistedClient>();
        List<ShortlistedClient1> shlclients = new List<ShortlistedClient1>();

        public DateTime? SelectedDateFormat { get; private set; }

        public Shortlist()
        {
            InitializeComponent();
        //    createShClientList();
            DataContext = shlclients;
            shlclients.Add(new ShortlistedClient1("Rich", "07515118265", "rich@gmail.com", "Glasgow", "Office", "MSc", "more than 3 years", "Yes", "No"));
            shlclients.Add(new ShortlistedClient1("Steve", "07515118265", "steve@gmail.com", "Glasgow", "Construction", "High School", "more than 3 years", "Yes", "No"));
            shlclients.Add(new ShortlistedClient1("Maria", "07485999005", "mb@gmail.com", "Edinburgh", "Office", "MSc", "more than 3 years", "No", "No"));
        }

        

        // method to add date to each selected client
        private void addInterviewDT(object sender, RoutedEventArgs e)
        {
            ShortlistedClient sc = dgr.SelectedItem as ShortlistedClient;

            if (sc != null )
            {
                sc.DT = DatePick.SelectedDate;
            }

alors ma définition de classe est comme ceci :

public class ShortlistedClient1 : Client, INotifyPropertyChanged
{
    private DateTime? _dt;

    public DateTime?  DT
    {
        get { return _dt; }
        set { _dt = value; NotifyPropertyChanged(); }
    }

    public bool InterestedinVac { get; private set; }


    public List<ShortlistedClient> clients { get; set; } = new List<ShortlistedClient1>();
    public ShortlistedClient(string n, string p, string e, string l, string wt, string q, string we, string dl, string cc) : base(n, p, e, l, wt, q, we, dl, cc)
    {
        DT = new DateTime();
        InterestedinVac = true;
    }

Ce que j’ai essayé :

I have tried changing DateOnly? to DateTime? in my ShortlistedClient class, and then set { _dt = value.ToShortDateString(); .. }   but it gives an error as well.

and I have tried
```
private DateTime _dt;

        public DateTime  DT
        {
            get { return _dt; }
            set { _dt = value.Date; NotifyPropertyChanged(); }
        }

        public bool InterestedinVac { get; private set; }

        public List<ShortlistedClient> clients { get; set; } = new List<ShortlistedClient>();
        public ShortlistedClient(string n, string p, string e, string l, string wt, string q, string we, string dl, string cc) : base(n, p, e, l, wt, q, we, dl, cc)
        {
            DT = new DateTime(); 
            InterestedinVac = true; 
        }

```
which gives:
```
Error	CS0266	Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)	

Solution 1

Vous pouvez définir le format de date dans la liaison de données. Par exemple:

XML
<DataGridTextColumn Binding="{StartDate, StringFormat=\{0:dd.MM.yy\}}" />

MIS À JOUR

Parfois, dans ces situations, il est utile de créer un projet prototype pour tester des fonctionnalités spécifiques avant de les implémenter dans votre projet principal. J’ai fait cela ici pour vous dans un projet de démonstration rapide montrant comment cela fonctionne :

1. Modèle de données

C#
public class Widget
{
    public string? Name { get; set; }
    public DateTime? Date { get; set; }
}

2. Code derrière

C#
public partial class MainWindow : Window
{
    private Random random = new();
    public ObservableCollection<Widget> Widgets { get; set; } = new();

    public MainWindow()
    {
        CreateWidgets();
        InitializeComponent();
    }

    private void CreateWidgets()
    {
        for (int i = 0; i < 10; i++)
        {
            Widgets.Add(new()
            {
                Name = $"Widget {i}", 
                Date = DateTime.Now.AddDays(random.NextDouble() * 5)
            });
        }
    }
}

3. Fenêtre :

XML
<Window x:Class="WpfDataGridDateColumnFormatting.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        x:Name="Window"
        Title="MainWindow" Height="450" Width="800">

    <DataGrid DataContext="{Binding ElementName=Window}"
              ItemsSource="{Binding Widgets}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name"
                                Binding="{Binding Name}" />
            <DataGridTextColumn Header="Date"
                                Binding="{Binding Date,
                                          StringFormat=\{0:dd.MM.yy\}}" />
        </DataGrid.Columns>
    </DataGrid>
</Window>

La sortie fonctionne comme décrit ci-dessus.

Solution 3

Un peu tard, mais le problème pourrait être la virgule manquante après le « DT » dans :

<datagridtextcolumn header="Interview Date" Binding="{Binding DT StringFormat=\{0:dd.MM.yy\}}" />

コメント

タイトルとURLをコピーしました