2012-07-24 114 views
2

我正在爲我的WPF應用程序創建一個新控件。其中,我添加了兩個依賴屬性。這些是給一個帶有子彈裝飾器的列表框的樣式。創建自定義WPF控件並將DataTemplate設置爲依賴項屬性

以下是我有:

public class QuestionControl : Control 
{ 
    static QuestionControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(QuestionControl), new FrameworkPropertyMetadata(typeof(QuestionControl))); 
    } 

    // Another dependency properties... 

    // PossibleAnswers : IEnumerable 
    public IEnumerable PossibleAnswers 
    { 
     get { return (IEnumerable)base.GetValue(PossibleAnswersProperty); } 
     set { base.SetValue(PossibleAnswersProperty, value); } 
    } 

    public static readonly DependencyProperty PossibleAnswersProperty = 
     DependencyProperty.Register("PossibleAnswers", typeof(IEnumerable), typeof(QuestionControl)); 

    // PossibleAnswers : DataTemplate 
    public DataTemplate PossibleAnswersTemplate 
    { 
     get { return (DataTemplate)base.GetValue(PossibleAnswersTemplateProperty); } 
     set { base.SetValue(PossibleAnswersTemplateProperty, value); } 
    } 

    public static readonly DependencyProperty PossibleAnswersTemplateProperty = 
     DependencyProperty.Register("PossibleAnswersTemplate", typeof(DataTemplate), typeof(QuestionControl)); 
} 

然後,我已經得到了通用的風格在這裏。請觀看我將PossibleAnswers設置爲列表框的最後一個樣式,並且綁定是可以的。但是在傳遞數據模板(這個被設置爲名爲ContentText的內容控件)的地方,並且我已經設置了名爲PossibleAnswersTemplate的模板,並且在這部分中它是錯誤的。

<ContentControl x:Name="ContentText" Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{TemplateBinding PossibleAnswersTemplate}" /> 

不編譯。應該是什麼錯誤?

<Style TargetType="ListBox" x:Key="KinectRadioList"> 
    <Style.Setters> 
     <Setter Property="ItemContainerStyle"> 
      <Setter.Value> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Style.Setters> 
         <Setter Property="OverridesDefaultStyle" Value="True"/> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
            <ControlTemplate.Resources> 
             <Style TargetType="{x:Type Ellipse}"> 
              <Style.Setters> 
               <Setter Property="Fill" Value="Black"/> 
               <Setter Property="Stroke" Value="Black"/> 
              </Style.Setters> 
              <Style.Triggers> 
               <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=IsEnabled}" Value="False"> 
                <Setter Property="Fill" Value="Black"/> 
                <Setter Property="Stroke" Value="Black"/> 
               </DataTrigger> 
              </Style.Triggers> 
             </Style> 
            </ControlTemplate.Resources> 
            <BulletDecorator Background="Transparent" > 
             <BulletDecorator.Bullet> 
              <Canvas Width="15" Height="15"> 
               <Ellipse Width="13" Height="13" Canvas.Left="1" Canvas.Top="1" StrokeThickness="1" Fill="{x:Null}"/> 
               <Ellipse Width="8" Height="8" Canvas.Left="3.5" Canvas.Top="3.5" Stroke="{x:Null}" Visibility="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=IsSelected, Converter={StaticResource BoolToVisibilityConverter}}"/> 
              </Canvas> 
             </BulletDecorator.Bullet> 
             <ContentControl x:Name="ContentText" Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{TemplateBinding PossibleAnswersTemplate}" /> 
            </BulletDecorator> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style.Setters> 
       </Style> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 


<Style TargetType="{x:Type local:QuestionControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:QuestionControl}"> 
        <StackPanel> 
         <ContentControl Content="{TemplateBinding QuestionText}" 
             ContentTemplate="{TemplateBinding QuestionTextTemplate}" /> 
         <ListBox ItemsSource="{TemplateBinding PossibleAnswers}" SelectionMode="Multiple" 
           Style="{StaticResource KinectRadioList}"/> 
        </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

回答

1
<ListBox ItemsSource="{TemplateBinding PossibleAnswers}" Tag="{TemplateBinding PossibleAnswersTemplate}" SelectionMode="Multiple" 
          Style="{StaticResource KinectRadioList}"/> 

    <ContentControl ContentTemplate="{TemplateBinding Tag}"/> 

模板是列表框和TemplateBinding正在試圖尋找PossibleAnswersTemplate在列表框,因此它不工作。我希望這將有所幫助。

編輯:這是另一種解決方案

<ContentControl Margin="2 0 0 0" Content="{Binding}" ContentTemplate="{Binding PossibleAnswersTemplate, RelativeSource={RelativeSource AncestorType={x:Type local:QuestionControl}}}" /> 
+0

沒有,也沒有工作。輸出拋出我:System.Windows.Data錯誤:4:無法找到與參考'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.UserControl',AncestorLevel ='1'綁定的源。 BindingExpression:路徑= PossibleAnswersTemplate;的DataItem = NULL;目標元素是'ContentControl'(Name ='');目標屬性是'ContentTemplate'(類型'DataTemplate') – 2012-07-24 15:49:25

+1

@DarfZon也許AncestorType是'local:QuestionControl'? – 2012-07-24 15:55:20

+0

我已經更新了答案。 – ethicallogics 2012-07-24 15:55:51

相關問題