2010-09-03 11 views
6

J'essaie d'utiliser un TextBox personnalisé dans le contrôle DatePicker, mais je ne peux pas obtenir la date à lier du calendrier popup au TextBox. Je ne veux pas avoir le style entier DatePicker sauf si je dois le faire, et le DatePickerTextBox a son propre contrôle, donc il doit y avoir un moyen de le modifier seulement. Le code ci-dessous est ce que j'ai en début:Personnalisé WPF DatePickerTextBox Modèle Aide

<Style TargetType="{x:Type DatePickerTextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DatePickerTextBox}"> 
       <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Je ne peux pas être en train de faire correctement le caractère contraignant, ou le PART_TextBox ne peut pas avoir raison, car il ne fait pas partie du modèle DatePicker lui-même.

Quelqu'un s'il vous plaît aider! :)

Merci d'avance!

Répondre

22

Essayez ceci:

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBox x:Name="PART_TextBox" 
            Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 
+0

C'est arrivé. Merci beaucoup! –

+0

J'ai un problème avec ceci: il n'honore pas le format de date court/long que le modèle par défaut fait. – dex3703

+3

@ dex3707 Vous pouvez ajouter StringFormat à TextBinding et spécifier le format, par ex. Dominik

3

Je sais que cela a été répondu depuis longtemps maintenant, mais se liant directement à la propriété Text de DatePicker permettrai au TextBox dans votre modèle de contrôle pour honorer facilement le court/Format long fourni par le DatePicker.

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBox Text="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 

Le « PART_TextBox » est pas non plus nécessaire, car il ne fait pas partie du modèle DatePickerTextBox. Les seules parties que le DatePickerTextBox contient sont:

[TemplatePart(Name = DatePickerTextBox.ElementContentName, Type = typeof(ContentControl))] 
public sealed partial class DatePickerTextBox : TextBox 

private const string ElementContentName = "PART_Watermark"; 

et héritée de TextBoxBase ...

[TemplatePart(Name = "PART_ContentHost", Type = typeof(FrameworkElement))] 
public abstract class TextBoxBase : Control 

internal const string ContentHostTemplateName = "PART_ContentHost"; 

Solution alternative: Si vous refusez d'utiliser le TextBox et utiliser la partie héritée vous sera en mesure de modifier le DatePickerTextBox sans modifier la fonctionnalité par défaut du contrôle.

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Grid SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
          <Border BorderThickness="{TemplateBinding BorderThickness}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            Background="{TemplateBinding Background}"/> 

          <ScrollViewer Name="PART_ContentHost" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 
+0

J'ai passé des heures sur ce sujet, puis J'ai trouvé votre réponse enfouie dans une pléthore de questions et de réponses. La vôtre est la meilleure implémentation. Bon produit! – Tronald