我如何在Silverlight中访问DataTemplate中的控件?

时间:2014-10-09 17:34:59

标签: c# silverlight checkbox datatemplate

我在Windows 8中使用Silverlight 5.1.30514.0,我有一个案例,其中根据表中的字段我需要提供不同数量的CheckBox,如果字段为4,则为4 CheckBox ,如果字段是6,那么6 CheckBox,这个字段可以是4,6,10或12,然后我在资源:

<DataTemplate x:Name="chkField4" DataType="ContentControl">
  <Grid Name="grd">
    <Border BorderBrush="Black" BorderThickness="1" Margin="0,0,0,0" Background="DarkSeaGreen" />
        <CheckBox Content="2" Name="chk2" Grid.Column="1" Margin="20,20,20,20"  Checked="CheckBox_Checked" />
        <CheckBox Content="1" Name="chk1" Grid.Column="1" Margin="20,60,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="4" Name="chk4" Grid.Column="1" Margin="80,20,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="3" Name="chk3" Grid.Column="1" Margin="80,60,20,20"  Checked="CheckBox_Checked"/>
   </Grid>
</DataTemplate>

另一个:

<DataTemplate x:Name="chkField6" DataType="ContentControl">
  <Grid Name="grd">
    <Border BorderBrush="Black" BorderThickness="1" Margin="0,0,0,0" Background="DarkSeaGreen" />
        <CheckBox Content="2" Name="chk2" Grid.Column="1" Margin="20,20,20,20"  Checked="CheckBox_Checked" />
        <CheckBox Content="1" Name="chk1" Grid.Column="1" Margin="20,60,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="4" Name="chk4" Grid.Column="1" Margin="80,20,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="3" Name="chk3" Grid.Column="1" Margin="80,60,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="6" Name="chk6" Grid.Column="1" Margin="140,20,20,20"  Checked="CheckBox_Checked"/>
        <CheckBox Content="5" Name="chk5" Grid.Column="1" Margin="140,60,20,20"  Checked="CheckBox_Checked"/>
   </Grid>
</DataTemplate>

每个案例还有2个类似的(chkField10,chkField12)。 我放了一个ContentControl:

<ContentControl Name="chk" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/>

如果字段= 4:

,则依赖于字段的代码
chk.ContentTemplate = chkField4;

现在,我想访问每个ComboBox以查看是否已选中,如:

if (chk2.IsChecked) ...
if (chk1.IsChecked) ...

但是,问题是:chk1,chk2,...无法询问它们,我想用&#34; for&#34;进行通用循环。或者&#34; foreach&#34; 1到n,其中n是ContentControl中时间内CheckBox的数量

我不知道如何做到这一点,或者如果我做得对,有人可以指导我吗?

我在这个环境中真的很新,谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用AnthonyWJones在this post

中创建的扩展方法

这是代码

public static class VisualTreeEnumeration
{
   public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
   {
     int count = VisualTreeHelper.GetChildrenCount(root);
     for (int i=0; i < count; i++)
     {
       var child = VisualTreeHelper.GetChild(root, i);
       yield return child;
       foreach (var descendent in Descendents(child))
         yield return descendent;
     }
   }
}

然后,要访问contentcontrol中的复选框,您可以这样做,假设您的contentcontrol的名称是chk。 (尝试使用更好的名称进行contentcontrol以避免混淆)

var checkBoxes = chk.Descendents().OfType<CheckBox>();

然后你可以对复选框的收集做一个预测。

foreach(var checkBox in checkBoxes)
{
    if(checkBox.IsChecked)
    {
        //Do Something
    }
}

希望有所帮助。