2010-01-20 3 views
2

У меня есть пользовательское управление Expander под названием SpecialExpander. Это в основном просто стандарт Expander с причудливым заголовком и парами свойств (HeaderText и IsMarkedRead).Ввод ContentControl * внутри * WPF DataTemplate?

Я начал с создания простой класс:

public class SpecialExpander : Expander 
{ 
    public string HeaderText { get; set; } 
    public bool IsMarkedRead { get; set; } 
} 

Затем я создал стиль, который задает пару свойств на детандер (например, полей, отступов и т.д.) и, что важно, он также определяет обычай DataTemplate для HeaderTemplate. Шаблон в основном представляет собой сетку с двумя строками.

Как показано на рисунке ниже ...

  • для верхнего ряда, я хотел бы фиксированный макет (это всегда TextBlockTextBlockCheckBox)
  • для нижнего ряда, однако, я хочу чтобы иметь возможность предоставлять пользовательский XAML для каждого расширителя.

Я попытался положить <ContentControl Grid.Row="1" ... /> в DataTemplate, но я не мог понять, как подключить его правильно.


alt text http://img85.imageshack.us/img85/1194/contentcontrolwithintem.jpg


alt text http://img29.imageshack.us/img29/1194/contentcontrolwithintem.jpg


Вопрос

Как я могу построить DataTemplate для моего SpecialExpander так, что заголовок имеет сома фиксированный контент (верхний ряд) и место-держатель для пользовательского контента (нижняя строка)?

На второй иллюстрации я хотел бы быть в состоянии сделать что-то вроде этого:

<SpecialExpander HeaderText="<Expander Header Text>" IsMarkedRead="True"> 
    <SpecialExpander.Header> 
     <StackPanel Orientation="Horizontal"> 
      <RadioButton Content="High" /> 
      <RadioButton Content="Med" /> 
      <RadioButton Content="Low" /> 
     </StackPanel> 
    <SpecialExpander.Header> 
    <Grid> 
     <Label>Main Content Goes Here</Label> 
    </Grid> 
</SpecialExpander> 

ответ

1

сегодня утром он ударил меня, как решить эту проблему: вместо того, чтобы строить SpecialExpander, я просто нужен нормальный Expander , Затем, для заголовка, я буду использовать пользовательский ContentControl под названием SpecialExpanderHeader.

Вот как это работает ...

класс SpecialExpanderHeader:

public class SpecialExpanderHeader : ContentControl 
{ 
    public string HeaderText { get; set; } 
    public bool IsMarkedRead { get; set; } 
} 

SpecialExpanderHeader стиль:

<Style TargetType="custom:SpecialExpanderHeader"> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="custom:SpecialExpanderHeader"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="5" /> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <StackPanel Grid.Row="0" Orientation="Horizontal"> 
         <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=HeaderText}" /> 
         <CheckBox Margin="100,0,0,0" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=IsMarkedRead}" /> 
        </StackPanel> 
        <Separator Grid.Row="1" /> 
        <ContentPresenter Grid.Row="2" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Expander стиль

<Style x:Key="Local_ExpanderStyle" TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}"> 
    <Setter Property="Margin" Value="0,0,0,10" /> 
    <Setter Property="Padding" Value="10" /> 
    <Setter Property="FontSize" Value="12" /> 
</Style> 

Использование

<Expander Style="{StaticResource Local_ExpanderStyle}"> 
    <Expander.Header> 
     <custom:SpecialExpanderHeader IsMarkedRead="True" HeaderText="Test"> 
      <StackPanel Orientation="Horizontal"> 
       <RadioButton Content="High" /> 
       <RadioButton Content="Medium" /> 
       <RadioButton Content="Low" /> 
      </StackPanel> 
     </custom:SpecialExpanderHeader> 
    </Expander.Header> 
    <Grid> 
     <!-- main expander content goes here --> 
    </Grid> 
</Expander> 
+0

Я люблю это, когда это случается :) –

+0

Привет, если это нормально для вас, то, Вы можете разделить весь этот пример приложения с нами, пожалуйста, так что каждый может наслаждаться код? – SharpUrBrain

Смежные вопросы