2010-01-25 72 views
0

第一個問題在這裏。無論如何,這裏是:基於SelectedDate更改DatePicker樣式

我有一個帶有很多DatePicker控件(CodePlex上的WPFToolkit的DatePicker)的XAML Windows。每個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 'Binding' cannot be set on the 'Value' property of type 'Trigger'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

我明白我的意思,我明白爲什麼這不起作用。 (請注意,MinDate的類型DateTime的值爲1/1/1990)

那麼,我怎樣才能在所有計算機上實現我的第一個代碼片段的結果?

謝謝你的時間。

回答

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> 

在代碼隱藏:

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

0

你不想要觸發器。您可以更改模板的樣式。 This文章是幫助我的。

此外,您可以設置當天如果你想。 Here是Datepicker文檔的鏈接。

+0

感謝您的聯繫。但是,我實際上並不想更改Calendar控件的樣式。只是在DatePickerTextBox中顯示的文本。我使用觸發器,因爲我想根據它的值更改文本框的樣式。我昨天可能不清楚這件事。 如果DatePickerTextBox的Text屬性是01/01/1990,我希望前景是DarkGray Italic,否則請改回Normal Normal,因此有一個視覺反饋哪些字段具有默認值。這就是我認爲使用觸發器的原因可能是正確的。 – 2010-01-26 08:12:18

+0

好吧,你可能需要一個觸發器,我只是不認爲使用這個日期是最好的事情來建立它的基礎。我可能綁定到一個布爾屬性,所以你不必擔心本地化。 – nportelli 2010-01-26 14:09:29

+0

謝謝,這幫助我走上正軌。我現在創建了一個轉換器,如果SelectedDate屬性等於我的默認Date值,則返回true,從而觸發樣式更改。奇蹟般有效。再次感謝。 – 2010-01-27 12:31:10