【问题标题】:Universal Windows Apps 8.1 DatePicker and TimePicker setting default stringUniversal Windows Apps 8.1 DatePicker 和 TimePicker 设置默认字符串
【发布时间】:2016-06-08 18:27:56
【问题描述】:

UWA 8.1 for Windows Store 和 Windows Phone (WinRT) 中的 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;
            }
        }
    }
}

【问题讨论】:

    标签: xaml mvvm win-universal-app mvvm-light windows-8.1-universal


    【解决方案1】:

    您可以在日期选择器上放置一个文本块,其中包含您想要的文本。

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

    【讨论】:

    • 我试过这个但遇到了一个问题,当用户单击 TextBlock 时,DatePicker 应该启动,但 DatePicker 没有我可以绑定以便打开它的属性,我看过这篇文章transoceanic.blogspot.in/2011/08/… 但我需要在 MVVM 中执行此操作,我想我可能需要继承并创建一个 DependencyProperty 但我想知道是否有人之前或以更好的方式完成它
    • 有一个日期选择器样式的转换器,如果绑定的日期属性为空,则将 contentpresenter 的不透明度设置为零。
    • 一开始我不明白你说什么,因为我在想“如何启动日期选择器”,然后我回头看看 IsHitTestVisible="False",我使用 XAML 已经 2 年了,检查我的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多