0

リストボックス内にリストボックスがあり、両方が監視可能なコレクションにバインドされています。両方の SelectionChanged イベントをオーバーロードしました。ネストされたリストボックスの場合、データ テンプレートにいくつかのラベルがあります。それらのラベルの内容を取得できるようにしたい。x:name プロパティが定義されていても、コードビハインドでそれらのいずれも参照できないため、難しいだけです。誰にもアイデアはありますか?

<ListBox Grid.Row="5" x:Name="lb1" ItemsSource="{Binding}" DataContext="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="lb1_SelectionChanged">

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                 <WrapPanel/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>
                 <Label x:Name="txtEnclosure" Content="{Binding Path=EnclosureID}"/>
                 <......other labels bound to other properties...>
                 <ListBox x:Name="lbserver" ItemsSource="{Binding Path=Slist}">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>

                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                 <Label x:Name="txtSlot" Content="{Binding Path=Slot}" />
                                 <Label x:Name="txtServer" Content="{Binding Path=HostnameID}" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

親リストボックスは、Elist という監視可能なコレクション (Enclosures の監視可能なコレクション、私が定義したクラス) にバインドします。

this.DataContext = Settings.Elist;

そして、子リストボックスは Enclosure クラス内の監視可能なコレクションにバインドします。

public class Enclosure
{
    public ObservableCollection<Server> Slist { get; set; }
    ...contains other variables as well....
}

アプリケーションでは、エンクロージャーがリストされ、各エンクロージャーにはサーバーのリストがあります。ユーザーはエンクロージャを選択でき、SelectedIndex に基づいて Elist からエンクロージャを取得できます (ElementAt(SelectedIndex) を使用します)。ネストされたリストボックスからサーバーの 1 つを取得しようとすると、事態はさらに複雑になります。リスト内のサーバーの 1 つを選択し、監視可能なコレクション Slist からサーバーを取得できるようにしたいと考えています。問題は、ユーザーがサーバーを直接選択すると、サーバーが Elist のどのエンクロージャからのものかわからないことです。また、コード ビハインドのネストされたリストボックスから何も参照できないため、SelectedIndex を取得できません。 >.< 確かに非常に苛立たしい問題です...誰かアイデアはありますか?

入れ子になったリストボックスの項目をコードで取得できれば、それも役に立ちます。

4

1 に答える 1

1

以下のサンプルは、ユーザーが子を選択したときに選択された親と子を取得する方法を示しています。OnSelectedModelChanged メソッドを参照してください。

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel>
        <ListBox ItemsSource="{Binding .}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
                        <ListBox ItemsSource="{Binding Path=Models}" SelectionChanged="OnSelectedModelChanged">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=Name}" />
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Window>

コードビハインド:

using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Controls.Primitives;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Make> cars = new List<Make>();
            cars.Add(new Make("Ford") { Models = new List<Model>() { new Model("F150"), new Model("Taurus"), new Model("Explorer") } });
            cars.Add(new Make("Honda") { Models = new List<Model>() { new Model("Accord"), new Model("Pilot"), new Model("Element") } });
            DataContext = cars; 
        }

        private void OnSelectedModelChanged(object sender, SelectionChangedEventArgs e)
        {
            Selector modelSelector = sender as Selector;
            Model selectedModel = modelSelector.SelectedItem as Model;
            Make selectedMake = modelSelector.DataContext as Make;
        }
    }

    public class Make
    {
        public Make(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }
        public IEnumerable<Model> Models { get; set; }
    }

    public class Model
    {
        public Model(string name)
        {
            Name = name;
        }
        public string Name { get; private set; }
    }
}
于 2012-06-20T21:11:41.927 に答える