0

リストボックスは、コンボボックスの置換だけでバインドされません(値が公開されます)

Xaml

  <ListBox SelectionChanged="LBX_AddTaskOptions_SelectionChanged"  HorizontalAlignment="Left" Margin="19,29,0,0" Name="LBX_AddTaskOptions" VerticalAlignment="Top" Width="125" FontWeight="Bold" Background="Beige">
                        <ListBoxItem Background="Beige" FontWeight="Bold" v>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="internet"></TextBlock>
                                <Image Source="Images\IE_BlackRed.png" Height="30"></Image>
                            </StackPanel>
                        </ListBoxItem>
                        <ListBoxItem Background="Beige" FontWeight="Bold">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="localFolder"></TextBlock>
                                <Image Source="Images\Folder_Black.png" Height="30"></Image>
                            </StackPanel>
                        </ListBoxItem>
                    </ListBox>

CodeBehind

    private void LBX_AddTaskOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var SelItm = LBX_AddTaskOptions.SelectedItem.ToString();

        MessageBox.Show(Sel);

    }

私はその質問を検索しましたが、答えは私が新鮮な.net開発者であるため複雑な問題のみですが、DDLテキスト/値を抽出するすべての方法を知っていますが、この単純な値の抽出を行う方法を理解できませんでした

簡単ではないですか?

messageBoxはコントロールの名前を表示します(:

4

2 に答える 2

2

これは、XAML の適切なアプローチではありません。各アイテムのマークアップを一覧表示するのではなく、 を使用しItemTemplateて外観を定義し、バインディングを使用して実際のアイテムをレンダリングします。

<ListBox SelectionChanged="LBX_AddTaskOptions_SelectionChanged" Name="LBX_AddTaskOptions">
    <ListBox.ItemTemplate>
        <ListBoxItem Background="Beige" FontWeight="Bold" v>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" />
                <Image Source="Images\IE_BlackRed.png" Height="30" />
            </StackPanel>
        </ListBoxItem>
    </ListBox.ItemTemplate>
</ListBox>

ListBoxItemsSourceをモデル データ自体 (つまり、この場合は文字列の配列) にバインドします。最終的にはおそらくビュー モデルを使用したくなるでしょうが、ロード時にコード ビハインドからアイテムを追加することもできます。

string[] ListBoxItems = new string[] { "internet", "local folder" };
LBX_AddTaskOptions.ItemsSource = ListBoxItems;

これによりSelectedValue、正しい値が得られるはずです。


脚注--質問に書き込んだマークアップを使用して、選択した値を取得できますが、それは醜く、XAML の目的全体を無効にします。にキャストSelectedItemしてから、ListBoxItemその子を取得し、それを StackPanel にキャスト、その子を取得するなど、アイデアを得る必要があります。そしてもちろん、マークアップがまったく変更された場合、今書いたコードはもはや有効ではありません。

于 2012-11-23T22:16:36.700 に答える
1

選択した値で取得する項目は、内部にコントロールを持つ ListBoxItem です。テキストのような値を抽出したい場合は、これを行う必要があります

private void LBX_AddTaskOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var SelItm = LBX_AddTaskOptions.SelectedItem as ListBoxItem;
        var StackPanel = SelItm.Content as StackPanel;
        foreach (var child in StackPanel.Children)
        {
            if(child is TextBlock)
            {
                MessageBox.Show((child as TextBlock).Text);
            }
        }

}

実際のテキストを取得するには、コントロールを掘り下げる必要があります。値を取得する方法はたくさんありますが、これはかなり基本的な方法です。

ToString() メソッドを呼び出すと、現在のオブジェクトが ListBoxItem である文字列に変換されます。

于 2012-11-23T22:23:03.833 に答える