ComboBox的Silverlight控件模板

时间:2012-08-28 20:42:48

标签: silverlight

使用Silverlight 5.0,我在网格中有一组复选框,如下所示:

<Border Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,25,10,0" Background="LightGray" Opacity="0.7" >
    <Grid Margin="5" >
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <CheckBox Grid.Row="0" Content="Item 1" Margin="0" />
        <CheckBox Grid.Row="1" Content="Item 1A" Margin="20,0,0,0" />
        <CheckBox Grid.Row="2" Content="Item 2" Margin="0" />
        <CheckBox Grid.Row="3" Content="Item 2A" Margin="20,0,0,0" />
        <CheckBox Grid.Row="4" Content="Item 2B" Margin="20,0,0,0" />
        <CheckBox Grid.Row="5" Content="Item 3" Margin="0" />
    </Grid>
</Border>

通过设置保证金,我得到了我想要的效果,即项目1A在项目1下缩进,项目2A和2B在项目2下缩进。

然而,这只是一个例子。这些项目还有很多,所以我宁愿使用某种Binding来解决这些问题。

我开始使用Name,IsSelected和Level(正常为0,缩进为20)和xaml这样的类:

<Border Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,25,10,0" Background="LightGray" Opacity="0.7" >
      <data:DataGrid x:Name="LayerOptionsGrid" AutoGenerateColumns="False" HeadersVisibility="None"> 
          <data:DataGrid.Columns>
              <data:DataGridCheckBoxColumn Binding="{Binding IsSelected}" />                                                     
              <data:DataGridTemplateColumn>
                   <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                             <ContentControl >
                                  <ContentPresenter Content="{Binding Name}" Margin="{Binding Level}" />
                             </ContentControl>
                        </DataTemplate>
                   </data:DataGridTemplateColumn.CellTemplate>
               </data:DataGridTemplateColumn>
           </data:DataGrid.Columns>
       </data:DataGrid>
   </Grid>
</Border>

我得到的是一个CheckBoxes和Names的网格,但不是太糟糕,但有两个主要问题:1)我没有Margin工作,所以没有缩进和2)Grid的工作方式,我必须单击复选框两次才能更改它(一次选择,我猜)。我正在寻找一种更好的方法来获得这个结果:

(Checkbox) Item 1
    (Checkbox) Item 1A 
(Checkbox) Item 2
    (Checkbox) Item 2A
    (Checkbox) Item 2B

等,这是我最初提供的暴力方法(虽然缺乏我需要的灵活性)。

注意:如果我提供一个名为Margin的Thickness属性并在ContentControl上添加Margin =“{Binding Margin}”,我会得到Text的缩进,但不会得到CheckBox的缩进。

我愿意接受任何选择。

1 个答案:

答案 0 :(得分:0)

我在查看问题的点击选择部分时找到了答案:我用以下CellEditingTemplate替换了我的整个CellTemplate:

<data:DataGridTemplateColumn>
    <data:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <CheckBox Margin="{Binding Margin}" IsThreeState="False" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Content="{Binding Name}" />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>

我也删除了这行

<data:DataGridCheckBoxColumn Binding="{Binding IsSelected}" />

解决了这两个问题。