2010-09-03 2 views
6

Я пытаюсь использовать пользовательский TextBox в элементе управления DatePicker, но я не могу получить дату привязки из всплывающего календаря до TextBox. Я не хочу, чтобы стиль всего DatePicker, если я не должен, и DatePickerTextBox имеет свой собственный контроль, поэтому должен быть способ изменить его. Приведенный ниже код является то, что у меня есть, как начать:Custom WPF DatePickerTextBox Template Help

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

Я не могу делать связывание правильно, или PART_TextBox не может быть прав, так как он не является частью самого DatePicker шаблона.

Кто-то, пожалуйста, помогите! :)

Заранее благодарен!

ответ

22

Попробуйте это:

<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

Это получилось. Большое спасибо! –

+0

У меня проблема с этим: он не соблюдает формат коротких/длинных дат, который делает шаблон по умолчанию. – dex3703

+3

@ dex3707 Вы можете добавить StringFormat в Textbinding и указать формат, например. Dominik

3

Я понимаю, что это был дан ответ в течение долгого времени, но привязки непосредственно к тексту собственности DatePicker «s позволит TextBox в шаблоне управления легко чтить Короткометражный/Длинный формат, предоставленный 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> 

«PART_TextBox» также не является необходимым, поскольку он не является частью DatePickerTextBox шаблона. Единственные части, что DatePickerTextBox содержит являются:

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

private const string ElementContentName = "PART_Watermark"; 

и унаследовал от TextBoxBase ...

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

internal const string ContentHostTemplateName = "PART_ContentHost"; 

Альтернативное решение: Если вы отказаться от использования TextBox и использовать унаследованное часть, которую вы будет иметь возможность изменять DatePickerTextBox без изменения функциональных возможностей элемента управления по умолчанию.

<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

Я трачу часы на это, а затем Я нашел ваш ответ заложенным во множестве вопросов и ответов. Ваша лучшая реализация. Хорошая вещь! – Tronald