WPF تحرير ساعات ودقائق DateTime
سؤال
لدي 3 مربعات نصية تحرير DateTime. من المهم أن نلاحظ أن مربعات النصين هذه تقوم بتحرير ساعة ومحضرات قيمة مربع النص الأول. واحد لتحرير التاريخ و 2 لتحرير ساعة ودقائق. كيف يمكنك أن تفعل ذلك؟ لا يعكس الرمز أدناه تغييرات وقت البيانات عند تحرير الساعة أو الدقيقة ، لأنه يتفقد ("HH") وفقدان قيمة 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\}}" />
بالطبع يمكنني الحصول على ViewModel كقراصية حيث أود حلها برمجياً. لكني أريد فقط أن أعرف ما إذا كان هناك أي احتمال مباشرة في XAML
المحلول
ليس من الممكن بسهولة مع XAML فقط. هناك العديد من الاحتمالات كيفية حل هذا:
1. اكتب عنصر تحكم مخصص أو عنصر تحكم مستخدم يمكنه القيام بذلك
يمكنك wirte عنصر تحكم / مستخدم مخصص (على سبيل المثال datetimetextbox) يحتوي على خاصية DateTime Value
يمكن أن يربط XAML الخاص بك ويحتوي على منطق للتحويل إلى قيمة وقت البيانات التي تم إدخالها في أحد مربعات النصين الخاصة به. بدلاً من مربعين نصين ، يمكنك أيضًا الحصول على شيء مثل MaskedTextBox.
2. اثنين من الخصائص المخصصة في ViewModel
إذا ذهبت مع MVVM ، فيمكنك إعطاء اثنين من العقارات المخصصة الخاصة بك int DateTimeHours
int DateTimeMinutes
وربط ضد ذلك:
<TextBox Text="{Binding MyDateTimeHours}" />
<TextBox Text="{Binding MyDateTimeMinutes}" />
ثم تقوم ViewModel بدمج الخصائص على قيمة وقت واحد.
نصائح أخرى
ستحتاج إلى استخدام محول مع ربط 2Way ومعلمة المحول. احفظ الساعة الأصلية في المحول. ثم يمكنك تحديث مصدر الربط بشكل مناسب.
إنني أقدر أن هذا منشور قديم ، لكنني صادفت هذا اليوم ووجدت طريقة أخرى للتعامل مع الروابط مع التاريخ والوقت.
لقد قمت بإنشاء فئة جزئية تسمى DateTime مع 4 خصائص واحدة للتاريخ ، 1 لساعة وآخر لمدة دقائق. ثم خاصية DateTime Readonly التي تُرجع تاريخًا مكتملًا.
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 ، استخدمت تخطيطًا للشبكة مع الروابط إلى datetimepicker واثنين من 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>
ثم لعرض التاريخ والوقت الصحيحين في قول نص يمكن استخدامه
<TextBlock Text="{Binding dateTime.dateTime, StringFormat={}{0:dd MMM yyyy - HH:mm}}"/>
آمل أن يساعد هذا شخص آخر.