Изменить стиль DatePicker на основе SelectedDate - PullRequest
0 голосов
/ 25 января 2010

Первый вопрос здесь. Во всяком случае, здесь это идет:

У меня есть Windows XAML с большим количеством элементов управления DatePicker (DatePicker из WPFToolkit на CodePlex). Каждый 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>

Обратите внимание на разницу в свойстве «Значение» триггера. Это приводит к следующей ошибке:

«Связывание» не может быть установлено на Свойство «Значение» типа «Триггер». «Связывание» может быть установлено только на Зависимость свойства DependencyObject.

Что я понимаю, и я понимаю, почему это не работает. (Обратите внимание, что MinDate имеет тип DateTime со значением 1/1/1990)

Итак, как мне добиться результата от моего первого фрагмента кода на всех компьютерах?

Спасибо за время.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Хорошо, для тех, кто случайно столкнулся с той же проблемой, вот что я наконец-то сделал:

В 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 был установлен на 1 января 1990 года в разделе «Настройки» моего проекта.

Так что теперь, если SelectedDate равен нулю или равен MinDate, преобразованное возвращаемое значение true, вызывая DataTrigger и изменяя стиль, если DatePickerTextBox.

Разве WPF не великолепен? : -)

0 голосов
/ 25 января 2010

Вам не нужен триггер. Вы можете просто изменить стиль шаблона. Эта статья - это то, что мне помогло.

Также Вы можете установить текущий день, если хотите. Здесь - ссылка на документацию для Datepicker.

...