自ListBox派生的自定义控件中的ItemContainerStyle

时间:2009-12-09 16:24:36

标签: silverlight xaml silverlight-3.0 listbox custom-controls

请与我一起讨论Silverlight Designer Gurus,这是对我的评价。

我正在创建一个从Silverlight 3.0 ListBox派生的自定义控件。为了不显示大量代码(最初),让我描述一下设置。

我有一个包含控制逻辑类的类库。然后我有一个包含样式细节的Themes / generic.xaml。在generic.xaml中,我有一个定义默认布局的样式,并查找ListBox,我在其中设置Template,ItemsPanel和ItemTemplate的值。

在我的测试应用中,我将我的控件添加到MainPage.xaml并运行它并且效果很好。我动态地将数据绑定到我的控件,并且工作正常。

现在我想为派生控件设置ItemContainerStyle。如果我在MainPage.xaml文件中创建一个样式并将ItemContainerStyle属性设置为该控件,如下所示:

<dti:myControl x:Name="MyControl1" ItemContainerStyle="{StaticResource MyListBoxItem}"
                                  Height="500" 
                                  Width="200" 
                                  Margin="10"
                                  Background="AliceBlue"
                                  />

它按预期工作。

但是,我想在类库中,或者更具体地说,在generic.xaml中执行此操作。我尝试将这个Setter改为我现在的风格:

<Setter Property="ItemContainerStyle">
  <Setter.Value>
    <ControlTemplate>
      <Grid Background="Red" Margin="3">
        <ContentPresenter x:Name="contentPresenter"
          ContentTemplate="{TemplateBinding ContentTemplate}"
            HorizontalAlignment="Stretch" Margin="3"/>
      </Grid>
    </ControlTemplate>
  </Setter.Value>
</Setter>

它惨遭失败:

“System.ArgumentException:'System.Windows.Controls.ControlTemplate'不是属性'ItemContainerStyle'的有效值。”

注意:这不是我想要用于ItemContainerStyle的实际样式。我实际上是想在这里为一个ListBoxItem的各种选择/未选择状态插入一些VSM(对于动态绑定控件)。

所以,问题是当使用generic.xaml定义时,如何将ItemContainterStyle应用于我的自定义控件?我以后在实际使用控件时不想要该属性设置。

谢谢,

Beaudetious

1 个答案:

答案 0 :(得分:2)

您错过了将Style标记放入Setter.Value中。 ItemContainerstyle将样式表示为ListBoxItem(除非您将ListBoxItem子类化为您自己的派生版本。)

<Setter Property="ItemContainerStyle"> 
   <Setter.Value>  
    <Style TargetType=”{x:Type ListBoxItem}“ >
      <Setter Property="Template">
        <Setter.Value>            
            <ControlTemplate> 
          <Grid Background="Red" Margin="3">        
              <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" HorizontalAlignment="Stretch" Margin="3"/> 
         </Grid> 
     </ControlTemplate>
    <Setter.Value>
    </Style>
 </Setter.Value>