Domanda

Ho 3 caselle di testo a modifica un DateTime . Ciò che è importante da notare è che quei 2 TextBoxes stanno modificando l'ora ei minuti del primo valore TextBox DateTime. Uno per modificare la data e 2 per modificare l'ora ei minuti. Come hai fatto? Il codice qui sotto non riflette il DateTime cambia quando si modifica l'ora o minuto, perché fa ToString ( "HH") e il valore DateTime viene perso:

 <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\}}"  />

Certo che può avere un ViewModel come DataContext dove vorrei risolverlo a livello di codice. Ma io voglio solo sapere se c'è qualche possiblity direttamente in XAML

È stato utile?

Soluzione

Non è facilmente possibile solo con XAML. Ci sono varie possibilità come risolvere questo:

1. controllo personalizzato di scrittura o di controllo utente che può fare questo

Si potrebbe wirte un controllo personalizzato / controllo utente (ad esempio DateTimeTextBox) che ha un DateTime Value proprietà che il codice XAML può legare contro e che contiene la logica per convertire al valore datetime inserito in uno dei suoi due caselle di testo. Invece di due caselle di testo si potrebbe anche avere qualcosa di simile MaskedTextBox.

2. Due proprietà dedicati nel ViewModel

Se si va con MVVM si potrebbe dare al vostro ViewModel due proprietà dedicati int DateTimeHours int DateTimeMinutes e si legano contro che:

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

Il tuo ViewModel sarebbe quindi unire i due oggetti da un unico valore DateTime.

Altri suggerimenti

Sarà necessario utilizzare un convertitore con 2 modo vincolante e un parametro del convertitore. Salvare l'ora originale nel convertitore. Quindi è possibile aggiornare l'origine vincolante in modo appropriato.

Mi rendo conto questo è un vecchio post, ma mi sono imbattuto in questo oggi e ha trovato un altro modo per attacchi manico con data e ora.

Ho creato una classe parziale chiamata dateTime con 4 proprietà uno per la data, per 1 ora e un'altra per minuti. Poi una sola lettura dateTime proprietà che restituisce una data completata.

    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

Poi nel XAML ho usato un layout griglia con le associazioni ad un DateTimePicker e un paio di 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>

Poi per visualizzare la data e l'ora corrette nel dire che un blocco di testo è possibile utilizzare

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

Spero che questo aiuti qualcun altro fuori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top