Привязка DateTime к TimePicker в формах Xamarin - PullRequest
0 голосов
/ 27 октября 2018

Я пытался привязать значение DateTime к TimePicker вместо TimeSpan. Если я изменю тип данных, мне придется изменить свой полный код.

Свойство называется Item.Time

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" Title="New Item">
    <ContentPage.ToolbarItems>
        <ToolbarItem Text="Save" Clicked="Save_Clicked" />
    </ContentPage.ToolbarItems>
    <ContentPage.Content>
        <StackLayout Spacing="20" Padding="15">
            <Label Text="Text" FontSize="Medium" />
            <TimePicker Time="{Binding Item.Time}"/>
            <Label Text="Description" FontSize="Medium" />
            <Editor Text="{Binding Item.Text}" FontSize="Small" Margin="0" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Как я могу преобразовать DateTime в TimeSpan, не используя другой класс или что-то в этом роде?

Возможно ли преобразовать его с помощью кода, подобного следующему:

<TimePicker Time="{Binding **(TimeSpan)**Item.Time}"/>

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Вы не можете сделать это без помощи какого-либо другого класса, поэтому вам нужно будет преобразовать его уже в вашей ViewModel и представить его как свойство и использовать его.

Это просто означает что-то вроде:

public TimeSpan MyTimeSpan
{
    get { return Item.Time; } // Assuming Item.Time is a TimeSpan
    set { Item.Time = value; }
}

Вы также можете использовать преобразователь значений.Для этого создайте новый класс, который реализует интерфейс IValueConverter.Должно быть что-то вроде этого, обратите внимание, что это псевдокод с моей головы и может не работать из коробки:

public class DateTimeToTimeSpanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((DateTime)value).Time;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var incomingTimeSpan = (TimeSpan)value;
        return new DateTime(2018, 1, 1, incomingTimeSpan.Hours, incomingTimeSpan.Minutes, incomingTimeSpan.Seconds);
    }
}

В вашем XAML вы можете использовать его следующим образом:

<ContentPage xmlns:local="clr-namespace:YourNamespaceName"...>
    <ContentPage.Resources>
        <ResourceDictionary>
            <local:DateTimeToTimeSpanConverter x:Key="timeSpanConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>
    ...
    <TimePicker Time="{Binding Item.Time, Converter={StaticResource timeSpanConverter}}"/>
    ...
</ContentPage>

Подробнее о преобразователях значений в Документах: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters

0 голосов
/ 28 октября 2018

Вы можете получить значение TimeStamp из объекта DataTime, например «DataTimeObject.TimeOfDay», TimeOfDay - это тип данных TimeStamp.

         <TimePicker x:Name="Timepicker"  HeightRequest="100" Time="{Binding 
          Item.TimeOfDay, Mode=TwoWay}" 
          PropertyChanged="TimePicker_PropertyChanged"/>                               
0 голосов
/ 27 октября 2018

Либо используйте преобразователь значений, либо добавьте свойство TimeSpan в модель представления

...