2014-10-09 43 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

相關問題