2014-10-09 45 views
0

我在Windows 8中使用Silverlight 5.1.30514.0,并且我有一种情况,其中根据表中的字段,我需要显示不同数量的CheckBox,如果字段为4,则为4 CheckBox,如果字段是6,则6 CheckBox和该字段可以是4,6,10或12,然后我使在资源:如何在Silverlight中访问控件到DataTemplate中?

<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,......不可问他们,我想提出一个通用的循环使用“为”或“的foreach “1到n,其中ni s在ContentControl中的CheckBox的数量

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

我在这样的环境真的新,感谢

+0

Hey Cyndy,你甚至在做这种事情的快速搜索,无论它在[这里](http://stackoverflow.com/questions/26258512/get-the-controls-inside-datatemplate-control)或[其他地方](https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=controls+inside+datatemplate+silverlight),然后再问?如果有的话,你可能会很快找到与[VisualTreeHelper](http://blog.falafel.com/finding-controls-by-type-in​​-silverlight-and-wpf/)相关的东西。 – 2014-10-09 17:45:51

+0

是的Chris W.,肯定的,我尝试过在这里和MSDN论坛的几个选项,但显然不是位于ContenControl儿童内部,无论在DataTemplate里面定义什么,都将其作为单个控件 – Cyndy 2014-10-09 18:32:47

回答

0

您可以使用在this post

这里创建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。 (尝试使用更好的内容名称来避免混淆)

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

然后,您可以对复选框进行一次foreach。

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

希望有所帮助。

+0

请!!!克里希纳,给我看一个与复选框集合的foreach的例子,我不知道如何做到这一点,你的建议是行之有效的 – Cyndy 2014-10-09 18:04:27

+0

我编辑了我的答案,但那只是一个基本的foreach循环。 – 2014-10-09 18:27:12

+0

克里希纳泰雅Veeramachaneni:非常好它工作得很好!!!非常感谢 – Cyndy 2014-10-09 18:37:36

相关问题