繁体   English   中英

列表框C#中的访问控制(Windows Phone 8)

[英]Access controls inside listbox c# (windows Phone 8)

         my xaml  code..
      <phone:PhoneApplicationPage.Resources>
    <DataTemplate x:Key="DataTemplate1" >
        <Border BorderBrush="LightGray" BorderThickness="1" Height="150"            Width="500" >
            <Grid Width="500" Height="150" Background="White" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.9*"/>
                    <ColumnDefinition Width="2.5*"/>
                    <ColumnDefinition Width="1.5*"/>

                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Image Name="imgitem"  Grid.Column="0" Height="Auto" Width="Auto" Source="{Binding ImgSource}" Margin="0,5,4,4" HorizontalAlignment="Left" />
                <TextBlock x:Name="txtbindprice"  Text="{Binding _PRICE,ConverterCulture=en-IN,StringFormat=C}" TextWrapping="Wrap"  Grid.Column="1"  Width="350"  Foreground="Black" Height="60" Margin="40,70,20,-10"/>
                <TextBlock x:Name="txtFinalTotal"  Text="{Binding _FinalTotal}" TextWrapping="Wrap"  Grid.Column="1"  Width="350"  Foreground="Red" Height="60" Margin="40,115,20,-10"/>
                <TextBlock x:Name="txtITMNAME"  Text="{Binding _ITMNAME }" Padding="1"  Tap="ItmName_Tapped" TextDecorations="Underline" FontSize="24" TextWrapping="Wrap" Grid.Column="1"  FontWeight="Normal" TextTrimming="WordEllipsis"  Foreground="OrangeRed" Width="Auto"  Height="150"  Margin="30,25,10,-10"/>
                <CheckBox  Grid.Column="2" Grid.Row="0" Background="Black" Foreground="Black" BorderThickness="4" BorderBrush="Red" Margin="10,20,-15,10"  Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked"  /> 

            </Grid>
        </Border>
    </DataTemplate>

     <ListBox Height="Auto" Name="lstbxmanual" SelectionMode="Extended" ItemTemplate="{StaticResource DataTemplate1 }"  Width="475" Margin="2,192,0,-39" Background="White"  HorizontalAlignment="Left" Grid.RowSpan="2">
    </ListBox>

我想根据所选索引访问列表框内的文本块

accessing textblock 
  string  a =txtbindprice.text

因为它们位于列表框的数据模板内,所以将无法工作。

我遇到了视觉子树方法和其他一些示例。.我找不到很多信息。

请帮助我...

以下方法查找当前选定的列表框项:

    private ListBoxItem FindSelectedListBoxItem(DependencyObject control)
    {
        int childNumber = VisualTreeHelper.GetChildrenCount(control);
        for (int i = 0; i < childNumber; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(control, i);
            FrameworkElement fe = child as FrameworkElement;
            // Not a framework element or is null
            if (fe == null) return null;

            if (child is ListBoxItem && ((ListBoxItem)child).IsSelected)
            {
                // Found the control so return
                return (ListBoxItem)child;
            }

            else
            {
                // Not found it - search children
                ListBoxItem nextLevel = FindSelectedListBoxItem(child);
                if (nextLevel != null)
                    return nextLevel;
            }
        }
        return null;
    }

下面的方法从给定的根控件中查找具有特定名称的任何子控件:

private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
{
    int childNumber = VisualTreeHelper.GetChildrenCount(control);
    for (int i = 0; i < childNumber; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(control, i);
        FrameworkElement fe = child as FrameworkElement;
        // Not a framework element or is null
        if (fe == null) return null;

        if (child is T && fe.Name == ctrlName)
        {
            // Found the control so return
            return child;
        }
        else
        {
            // Not found it - search children
            DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
            if (nextLevel != null)
                return nextLevel;
        }
    }
    return null;
}

现在,您可以使用第一种方法获取当前选择的ListBoxItem ,然后将其传递给第二种方法以检索此ListBoxItem内部的任何控件(例如txtbindprice ):

ListBoxItem item = FindSelectedListBoxItem(this);
TextBlock txtPrice = FindChildControl<TextBlock>(item , "txtbindprice") as TextBlock;
string a = txtPrice.Text;

更新

您可以像这样将SelectionChanged事件添加到您的ListBox

 <ListBox Height="Auto" Name="lstbxmanual" SelectionChanged="OnSelectionChanged">
</ListBox>

然后以这种方式检索某个TextBlock.Text (例如txtbindprice ):

public void OnSelectionChanged(object sender, SelectionChangedEventArgs args)
{
    ListBoxItem item = FindSelectedListBoxItem((ListBox(sender)));
    TextBlock txtPrice = FindChildControl<TextBlock>(item , "txtbindprice") as TextBlock;
    string a = txtPrice.Text;
}

暂无
暂无

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

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