繁体   English   中英

如何在Silverlight中访问控件到DataTemplate中?

[英]How I access to controls into a DataTemplate in Silverlight?

我在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;

现在,我想访问每个组合框以查看是否已选中,例如:

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

但是,问题是:chk1,chk2,...无法用于请求它们,我想使用“ for”或“ foreach” 1到n进行通用循环,其中n是CheckBox的数量一次在ContentControl中

我不知道该怎么做,或者如果我做对了,有人可以指导我吗?

在这种环境下,我真的很新,谢谢

您可以使用AnthonyWJones在本文中创建的扩展方法

这是代码

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操作。

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

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM