質問

3つのテキストボックスがあります DateTimeを編集します。注意することが重要なのは、これらの2つのテキストボックスが最初のテキストボックスDateTime値の時間と議事録を編集していることです。 1つは日付を編集し、2つを編集して時間と分を編集します。どうしますか?以下のコードは、時間または分を編集するときのDateTimeの変更を反映していません。

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

もちろん、プログラムでそれを解決するDataContextとしてViewModelを持つことができます。しかし、Xamlに直接可能性があるかどうかを知りたいだけです

役に立ちましたか?

解決

XAMLのみで簡単には不可能です。これを解決する方法はいくつかあります:

1.これを行うことができるカスタムコントロールまたはユーザーコントロールを作成する

プロパティを備えたカスタムコントロール /ユーザーコントロール(DateTimetextBoxなど)をWIRTEできます DateTime Value XAMLがバインドできること、およびそれにはロジックが含まれて、2つのテキストボックスのいずれかに入力されたDateTime値に変換されます。 2つのテキストボックスの代わりに、MaskedTextBoxのようなものを持つこともできます。

2. ViewModelの2つの専用プロパティ

MVVMを使用すると、ViewModelを2つの専用プロパティに与えることができます int DateTimeHours int DateTimeMinutes そしてそれに対して縛ります:

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

ViewModelは、2つのプロパティを単一のDateTime値にマージします。

他のヒント

2ウェイバインディングとコンバーターパラメーターを備えたコンバーターを使用する必要があります。コンバーターの元の時間を保存します。次に、バインディングソースを適切に更新できます。

これは古い投稿であることに感謝していますが、今日はこれに出会い、日付と時刻でバインディングを処理する別の方法を見つけました。

日付用の4つのプロパティ、1時間、もう1つは数分でDateTimeと呼ばれる部分クラスを作成しました。次に、完了した日付を返すReadonly DateTimeプロパティ。

    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

次に、XAMLでは、Bindingsを使用してGrid LayoutをDateTimePickerといくつかのコンボボックスに使用しました。

            <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>

次に、正しい日付と時刻を表示するには、テキストブロックを使用できます

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

これが他の誰かを助けることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top