سؤال

لدي 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}}"/>

آمل أن يساعد هذا شخص آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top