0

我的应用程序中有一个 ListPicker,其定义如下:

<DataTemplate x:Name="PickerItemTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding code}" Margin="12 0 0 0" Visibility="Collapsed"/>
                <TextBlock Text="{Binding name}" Margin="12 0 0 0"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Name="PickerFullModeItemTemplate">
            <StackPanel Orientation="Horizontal" Margin="16 21 0 20">
                <TextBlock Text="{Binding name}" Margin="16 0 0 0"
FontSize="43" FontFamily="{StaticResource PhoneFontFamilyLight}"/>
            </StackPanel>
        </DataTemplate>

<toolkit:ListPicker x:Name="_1stLanguageListPicker"
                    ItemTemplate="{StaticResource PickerItemTemplate}"
                    FullModeItemTemplate="{StaticResource PickerFullModeItemTemplate}" 
                    Header="1st Specie Name Language"
                    FullModeHeader="1st Specie Name Language"
                    CacheMode="BitmapCache"/>

如您所见,我只向用户显示全名,隐藏代码。但作为一名程序员,我想使用代号。

如何获得这个名字?

我试过这样

if (_1stLanguageListPicker.SelectedIndex == 0)
{
    firstlang = "GB" 
}

但不起作用(一些布尔到 int 的问题,正常 = 也不起作用),这对于许多项目列表来说是一个不好的方法,因为您必须放置许多 IF 语句。

4

1 回答 1

0

我的理解是,你的问题是在后面的代码中获取代码TextBlock的数据。

首先给你的 TextBlock 起个名字

<TextBlock x:Name="codeTextBlock" Text="{Binding code}" />

然后使用以下代码访问“代码”

if (listPicker.SelectedIndex > -1)
        {
            var item = listPicker.ItemContainerGenerator.ContainerFromIndex(listPicker.SelectedIndex);
            SearchVisualTree(item);
        }

在这里,SearchVisualTree() 是:

 private void SearchVisualTree(DependencyObject targetElement)
    {
        var count = VisualTreeHelper.GetChildrenCount(targetElement);
        if (count == 0)
            return;

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(targetElement, i);
            if (child is TextBlock)
            {
                TextBlock targetItem = (TextBlock)child;

                if (targetItem.Name == "codeTextBlock")
                {
                    var code = targetItem.Text;
                    return;
                }
            }
            else
            {
                SearchVisualTree(child);
            }
        }
    }

这里一个可能的问题是(您面临的),我们无法在加载 ListPicker 之前访问 DataTemplate。在其他工作中,在为 ListPicker 生成 DataTemplate 之前。所以上面代码的放置非常重要。

希望这可以帮助

于 2012-06-21T13:06:23.730 回答