根据SelectedDate更改DatePicker样式

时间:2010-01-25 15:19:13

标签: wpf xaml triggers datepicker styles

这里的第一个问题。无论如何,这里是:

我有一个带有很多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>

注意触发器的“Value”属性的区别。这会产生以下错误:

  

无法设置'绑定'   '触发'类型的'价值'属性。一个   '绑定'只能在a上设置   DependencyProperty的一个   的DependencyObject。

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

那么,我怎样才能从所有计算机上的第一个代码片段中获得结果呢?

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

好的,对于碰巧遇到同样问题的人来说,这就是我最终做的事情:

在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>

在codebehind中:

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不是很棒吗? : - )

答案 1 :(得分:0)

您不需要触发器。您只需更改模板的样式即可。 This文章对我有所帮助。

您也可以根据需要设置当天。 Here是Datepicker文档的链接。