2010-09-03 20 views
6

Sto tentando di utilizzare un controllo personalizzato nel controllo DatePicker, ma non riesco a ottenere la data da associare dal calendario popup allo TextBox. Non voglio dover modificare l'intero DatePicker a meno che non sia necessario e lo DatePickerTextBox ha il proprio controllo, quindi deve esserci un modo per modificarlo. Il codice qui sotto è quello che ho come un inizio:Guida modello WPF DatePickerTextBox personalizzato

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

non possono essere facendo il legame correttamente, oppure il PART_TextBox non può essere giusto dato che non è parte del modello DatePicker stesso.

Qualcuno per favore aiuto! :)

Grazie in anticipo!

risposta

22

Prova questo fuori:

<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

L'ho capito. Grazie mille! –

+0

Ho un problema con questo: non rispetta il formato di data breve/lungo che il modello predefinito fa. – dex3703

+3

@ dex3707 È possibile aggiungere StringFormat alla TextBinding e specificare il formato, ad es. Dominik

3

Mi rendo conto che questo è stato risposto per molto tempo, ma legandosi direttamente alla proprietà Text s' il DatePicker permetterà al TextBox nel modello di controllo per onorare facilmente il Breve/Formato lungo fornito da 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> 

Il "PART_TextBox" non è necessario anche perché non è parte del modello DatePickerTextBox. Le uniche parti che il DatePickerTextBox contiene sono:

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

private const string ElementContentName = "PART_Watermark"; 

ed ereditato da TextBoxBase ...

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

internal const string ContentHostTemplateName = "PART_ContentHost"; 

Soluzione alternativa: Se si opta fuori utilizzando il TextBox e utilizzare la parte ereditata voi sarà in grado di modificare il DatePickerTextBox senza alterare la funzionalità predefinita del controllo.

<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

Ho trascorso ore su questo, e quindi Ho trovato la tua risposta sepolta dentro una pletora di domande e risposte. La tua è la migliore implementazione. Roba buona! – Tronald