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" 
}

しかし、うまくいきません (bool から int への問題、normal = もうまくいきません)。これは、多くの 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);
            }
        }
    }

ここで考えられる問題の 1 つは (直面した)、ListPicker が読み込まれる前に DataTemplate にアクセスできないことです。他の作業では、DataTemplate が ListPicker 用に生成される前。したがって、上記のコードの配置は非常に重要です。

お役に立てれば

于 2012-06-21T13:06:23.730 に答える