WPFは、DateTimeの時間と議事録を編集します
質問
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}}"/>
これが他の誰かを助けることを願っています。