0

Windows Store 和 Windows Phone (WinRT) 的 UWA 8.1 中的 DatePicker 和 TimePicker 默认显示今天的日期和当前时间,而我最初想将这两个控件设置为一些默认字符串让我们说“设置截止日期/时间”,因为它们'是可选的。

我仅使用 MVVM 模式和 MVVM 灯光库将它们绑定到以下属性

public DateTimeOffset? DueDate { get; set; }

public TimeSpan? DueTime { get; set; }

我已经尝试过以下方式,请提出任何解决方案。

我使用了两个转换器,但有一个问题。

当我单击“设置截止日期”按钮,然后单击 DatePicker 弹出屏幕中的勾号而不更改日期、月份或年份时,转换器不会触发,当我更改日期、月份或年份时它触发,我看到即使属性绑定是可为空的 DateTimeOffset XAML 中的 DatePicker 显示当前日期的日期值,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

1

您可以在日期选择器上放置一个带有所需文本的文本块。

根据您的 DueDate/DueTime 属性的值设置文本块的可见性,使用转换器(如果它的 null 返回可见,否则返回折叠)。

于 2016-06-09T07:29:06.393 回答