【问题标题】:Change DatePicker style based on SelectedDate根据 SelectedDate 更改 DatePicker 样式
【发布时间】:2010-01-25 15:19:13
【问题描述】:

这里的第一个问题。不管怎样,就这样吧:

我有一个带有很多 DatePicker 控件的 XAML Windows(来自 CodePlex 上的 WPFToolkit 的 DatePicker)。每个 DatePicker 的默认值为 1/1/1990,如果没有选择其他日期,我希望(或者更确切地说是我的老板 :-))以灰色斜体而不是黑色显示文本。因此,可以轻松查看日期尚未输入的字段。

这可能很容易,但我对 WPF/XAML 还是很陌生。事实上,这些是我使用它的第一步。

这就是我所拥有的,并且实际上效果很好:

    <Style TargetType="{x:Type my:DatePicker}">
        <Style.Triggers>
            <Trigger Property="Text" Value="1/1/1990">
                <Setter Property="Foreground" Value="DarkGray"/>
                <Setter Property="ToolTip" Value="Please select a date"/>
                <Setter Property="FontStyle" Value="Italic"/>
            </Trigger>
        </Style.Triggers>
    </Style>

问题是,由于本地化/区域设置问题,它并不适用于每台机器。

所以我尝试了这个:

 <Style TargetType="{x:Type my:DatePicker}">
    <Style.Triggers>
        <Trigger Property="Text" Value="{Binding Source={x:Static p:Settings.Default}, Path=MinDate, Mode=TwoWay}">
            <Setter Property="Foreground" Value="DarkGray"/>
            <Setter Property="ToolTip" Value="Veuillez choisir une date"/>
            <Setter Property="FontStyle" Value="Italic"/>
        </Trigger>
    </Style.Triggers>
</Style>

注意触发器的“值”属性的不同。这会产生以下错误:

无法在 “触发器”类型的“值”属性。一种 “绑定”只能设置在 a 的 DependencyProperty 依赖对象。

我确实理解它的含义,并且我理解为什么这不起作用。 (请注意,MinDate 是 DateTime 类型,值为 1/1/1990)

那么,我如何在所有计算机上实现我的第一个代码 sn-p 的结果?

感谢您的时间。

【问题讨论】:

    标签: wpf xaml triggers datepicker styles


    【解决方案1】:

    好的,对于那些碰巧遇到同样问题的人,这就是我最终所做的:

    在 XAML 中:

    <src:ConvertMinDate x:Key="ConvertMinDate"/>
    
    <Style TargetType="{x:Type my:DatePicker}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedDate, RelativeSource={RelativeSource Self}, 
                    Converter={StaticResource ConvertMinDate}}" Value="True">
                    <Setter Property="Foreground" Value="DarkGray"/>
                    <Setter Property="ToolTip" Value="Select a date"/>
                    <Setter Property="FontStyle" Value="Italic"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    

    在代码隐藏中:

    public class ConvertMinDate : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
    
            if (value == null)
            {
                return true;
            }
            else
            {
                DateTime date = Peche.Properties.Settings.Default.MinDate;
                if (value is DateTime)
                {
                    date = (DateTime)value;
                    return date == Peche.Properties.Settings.Default.MinDate;
                }
                else
                {
                    return true;
                }
            }
    
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    MinDate 在我的项目的“设置”部分中已设置为 1990 年 1 月 1 日。

    所以现在,如果 SelectedDate 为 null 或等于 MinDate,则转换后返回 true,从而触发 DataTrigger 并更改 DatePickerTextBox 的样式。

    WPF 不是很好吗? :-)

    【讨论】:

      【解决方案2】:

      您不想要触发器。您可以更改模板的样式。 This 文章对我有帮助。

      您还可以根据需要设置当前日期。 Here 是 Datepicker 文档的链接。

      【讨论】:

      • 感谢您的链接。但是,我实际上并不想更改 Calendar 控件的样式。只是显示在 DatePickerTextBox 中的文本。我使用触发器,因为我想根据它的值更改文本框的样式。我昨天可能还不清楚。如果 DatePickerTextBox 的 Text 属性是 01/01/1990,我希望前景为 DarkGray Italic,否则更改回 Normal Black,因此可以直观地反馈哪些字段具有默认值。这就是我认为使用触发器可能是正确的原因的原因。
      • 好吧,你可能想要一个触发器,我只是不认为使用那个日期是最好的基础。我可能会绑定到 bool 属性,因此您不必担心本地化。
      • 谢谢,这帮助我走上了正轨。我现在创建了一个转换器,如果 SelectedDate 属性等于我的默认 Date 值,则返回 true,从而触发样式更改。奇迹般有效。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2013-02-09
      • 2017-09-15
      相关资源
      最近更新 更多