Question

J'ai 3 à TextBoxes modifier DateTime . Ce qui est important à noter est que ces 2 zones de texte modifient l'heure et les minutes de la première valeur TextBox DateTime. L'un pour modifier la date et 2 à modifier l'heure et les minutes. Comment feriez-vous cela? Le code ci-dessous ne reflètent pas les changements DateTime lors de l'édition à l'heure ou minute, parce qu'il fait ToString ( « HH ») et la valeur DateTime est perdue:

 <TextBox Text="{Binding MyDateTime}"  />

    <!--This cannot work : it's just for clearing purposes -->
    <TextBox Text="{Binding MyDateTime, StringFormat=\{0:HH\}}}"  />
    <TextBox Text="{Binding MyDateTime}, StringFormat=\{0:mm\}}"  />

Bien sûr, je peux avoir un ViewModel comme DataContext où je le résoudre par programme. Mais je veux juste savoir s'il y a une possibilité directement en XAML

Était-ce utile?

La solution

Il est difficilement possible avec XAML seulement. Il y a plusieurs possibilités comment résoudre ce problème:

1. Ecrire un contrôle personnalisé ou le contrôle de l'utilisateur qui peut le faire

Vous pourriez wirte un contrôle personnalisé / contrôle utilisateur (par exemple DateTimeTextBox) qui a une propriété DateTime Value que votre XAML peut se lier contre et qui contient la logique de se convertir à la valeur datetime est entré dans l'un de ses deux zones de texte. Au lieu de deux zones de texte, vous pouvez aussi avoir quelque chose comme MaskedTextBox.

2. Deux propriétés dédiées à la ViewModel

Si vous allez avec MVVM, vous pouvez donner à votre ViewModel deux propriétés dédiées int DateTimeHours int DateTimeMinutes et se lient contre que:

<TextBox Text="{Binding MyDateTimeHours}"  />
<TextBox Text="{Binding MyDateTimeMinutes}"  />

Votre ViewModel alors fusionner les deux propriétés à une seule valeur DateTime.

Autres conseils

Vous aurez besoin d'utiliser un convertisseur avec 2 voies de liaison et un paramètre de conversion. Enregistrez l'heure d'origine dans le convertisseur. Ensuite, vous pouvez mettre à jour la source de liaison appropriée.

J'apprécie c'est un ancien poste, mais je suis tombé aujourd'hui et a trouvé un autre moyen de fixations de la poignée avec date et heure.

Je créé une classe partielle appelée dateTime avec 4 propriétés pour une date, 1 heure pour et un autre pour les minutes. Ensuite, une propriété en lecture seule dateTime qui retourne une date de fin.

    Partial Public Class dateTimeValue
        Property Dt As Date
        Property Hr As Integer
        Property Mn As Integer

        ReadOnly Property dateTime As Date
            Get
                Dim d = Dt
                d = d.AddHours(d.Hour * -1).AddHours(Hr)
                d = d.AddMinutes(d.Minute * -1).AddMinutes(Mn)
                d = d.AddSeconds(d.Second * -1)
                Return d
            End Get
        End Property
    End Class

Ensuite, dans le XAML j'ai utilisé une présentation de la grille avec les fixations à un DateTimePicker et quelques ComboBoxes.

            <UniformGrid Columns="2">
                <TextBlock Text="Date"/>
                <DatePicker SelectedDate="{Binding dateTime.Dt}"/>
                <TextBlock Text="Time"/>
                <WrapPanel>
                    <ComboBox SelectedValue="{Binding dateTime.Hr}" SelectedValuePath="Content">
                        <ComboBoxItem>00</ComboBoxItem>
                        <ComboBoxItem>01</ComboBoxItem>
                        <ComboBoxItem>02</ComboBoxItem>
                        .........
                        <ComboBoxItem>22</ComboBoxItem>
                        <ComboBoxItem>23</ComboBoxItem>
                    </ComboBox>
                    <TextBlock Text=":"/>
                    <ComboBox SelectedValue="{Binding dateTime.Mn}" SelectedValuePath="Content">
                        <ComboBoxItem>00</ComboBoxItem>
                        <ComboBoxItem>15</ComboBoxItem>
                        <ComboBoxItem>30</ComboBoxItem>
                        <ComboBoxItem>45</ComboBoxItem>
                    </ComboBox>
                </WrapPanel>
                <Button Click="saveTask" Content="Save Task"/>
            </UniformGrid>

Ensuite, pour afficher la date et l'heure à dire textblock vous pouvez utiliser

<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/>

Espérons que cela aide quelqu'un d'autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top