0

WindowsストアおよびWindows Phone(WinRT)用のUWA 8.1のDatePickerとTimePickerは、デフォルトで今日の日付と現在の時刻を表示しますが、最初に両方のコントロールをデフォルトの文字列に設定したいので、「期日/時刻を設定」と言いますオプションです。

MVVMパターンとMVVMライトライブラリのみを使用して、それらを次のプロパティにバインドしています

public DateTimeOffset? DueDate { get; set; }

public TimeSpan? DueTime { get; set; }

私は次の方法で試しましたが、解決策を提案してください。

2 つのコンバーターを使用しましたが、問題があります。

「期限の設定」というボタンをクリックし、日付、月、または年を変更せずにDatePickerポップアップ画面の目盛りをクリックすると、日付、月、または年を変更してもコンバーターが起動しませんバインドされたプロパティがnull可能なDateTimeOffsetであっても、XAMLのDatePickerはDate値を現在の日付に表示し、IsHitTestVisible = "False"は傾斜効果を削除します。ボタンをクリックできないためです。もう、しかし、傾斜効果は私にとって必須のオプションではありません

<Page
    x:Class="UWP.MVVM.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWP.MVVM"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="using:UWP.MVVM.ViewModels"
    xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
    xmlns:core="using:Microsoft.Xaml.Interactions.Core"
    xmlns:converters="using:UWP.MVVM.Converters"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Page.Resources>
        <converters:DateTimeOffsetToVisibilityConverter x:Key="DateTimeOffsetToVisibilityConverter"/>
        <converters:DateTimeOffsetToOpacityConverter x:Key="DateTimeOffsetToOpacityConverter"/>
    </Page.Resources>

    <Grid Margin="24,24">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBox Header="First Name" 
                 Text="{Binding Person.FirstName}"/>
        <DatePicker Name="DateOfBirth"
                    Date="{Binding Person.DateOfBirth, Mode=TwoWay}"
                    Grid.Row="1"
                    Opacity="{Binding Person.DateOfBirth, Converter={StaticResource DateTimeOffsetToOpacityConverter}}"/>
        <Button Grid.Row="1"
                Content="Set Due Date"
                IsHitTestVisible="False"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                HorizontalContentAlignment="Left"
                Visibility="{Binding Person.DateOfBirth, Converter={StaticResource DateTimeOffsetToVisibilityConverter}}"/>
    </Grid>
</Page>

namespace UWP.MVVM.Converters
{
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Data;

    public class DateTimeOffsetToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value == null)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            if (value == Visibility.Visible)
            {
                return null;
            }
            else
            {
                return DateTimeOffset.Now;
            }
        }
    }
}

namespace UWP.MVVM.Converters
{
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Data;

    public class DateTimeOffsetToOpacityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value == null)
            {
                return 0D;
            }
            else
            {
                return 1D;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            if (value == 0D)
            {
                return null;
            }
            else
            {
                return DateTimeOffset.Now;
            }
        }
    }
}
4

1 に答える 1