none
Windows Phone 7中怎么查找DataTemplate中的控件? RRS feed

  • 问题

  • 我在LongListSelector控件有用DataTemplate布局联系人如下

    <DataTemplate x:Key="ItemsTemplate">
                <Grid Margin="0,0,0,20" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="90"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="60"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="0.3*"/>
                    </Grid.RowDefinitions>
                   <!-- <Image x:Name="imgHead" Source="/Images/head.jpg" Grid.Row="0" Grid.RowSpan="2" Width="90" Height="90"/>-->
                    <TextBlock x:Name="tbName" Grid.Row="0" Grid.Column="1"  FontSize="38"  TextAlignment="Left" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Name}" />
                    <TextBlock  x:Name="tbPhone" Grid.Row="1" Grid.Column="1"  FontSize="25"  TextAlignment="Left" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Phone}"  />
                    <CheckBox Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" IsChecked="{Binding IsCheck, Mode=TwoWay}" x:Name="cbCheck"/>
                </Grid>
            </DataTemplate>
    


    在后台代码中我用下面方法获取选中的CheckBox

     string phones = string.Empty;
                sb.Clear();
    
                
                if (VisualTreeHelper.GetChildrenCount(lsAllContacts) > 0)
                {
                    IEnumerable<Grid> AllGrids = FindChildren<Grid>(this.lsAllContacts);//得到所有的Grid
                    foreach (var grid in AllGrids.ToList())
                    {
                        object objTbPhone = grid.FindName("tbPhone");
                        if (objTbPhone != null)
                        {
                            object objCheck = grid.FindName("cbCheck");
                            object objName = grid.FindName("tbName");
    
                            if (objCheck != null)
                            {
                                if (((CheckBox)objCheck).IsChecked == true)
                                {
                                    smsComposeTask.To += ((TextBlock)objTbPhone).Text;
    
                                   sb.Append(((TextBlock)objName).Text + ";");
                                }
                            }
                        }
    
                    }
                }
    
    


    FindChildren方法

    public IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class
            {
                var count = VisualTreeHelper.GetChildrenCount(parent);
                if (count > 0)
                {
                    for (var i = 0; i < count; i++)
                    {
                        var child = VisualTreeHelper.GetChild(parent, i);
                        var t = child as T;
                        if (t != null)
                            yield return t;
    
                        var children = FindChildren<T>(child);
                        foreach (var item in children)
                            yield return item;
                    }
                }
            }
    


    用这种方法得不到所有的CheckBox,只能得到部份,不知道是为什么,程序中是递归了子控件的呀。

    2012年1月7日 7:13

答案

  • Hi,

    如果确定已经得到了所有的Grid,那么可以进行单步调试,进入控件中查看是否获取了相应的控件

    如果无法获取,则如你提供的代码,FindChildren<CheckBox>可以成为你的下一步执行的代码.来获取你需要的Element.

    • 已标记为答案 Otomii Lu 2012年1月17日 8:27
    2012年1月9日 5:32

全部回复

  • grid控件采用树形结构存储,遍历子控件时建议采用使用Silverlight Toolkit TreeView

    http://silverlight.codeplex.com/


    Xuesong
    2012年1月9日 2:47
    版主
  • Hi,

    如果确定已经得到了所有的Grid,那么可以进行单步调试,进入控件中查看是否获取了相应的控件

    如果无法获取,则如你提供的代码,FindChildren<CheckBox>可以成为你的下一步执行的代码.来获取你需要的Element.

    • 已标记为答案 Otomii Lu 2012年1月17日 8:27
    2012年1月9日 5:32