Связывание в связывании с шаблонами (WPF) - PullRequest
1 голос
/ 14 июня 2010

У меня есть пользовательский интерфейс WPF, связанный с коллекцией AwesomeClass

Теперь у AwesomeClass есть коллекция объектов AwesomeParts.

Как я могу сделать свой пользовательский интерфейс таким образом, что (какпример)
для каждого экземпляра AwesomeClass есть вкладка на панели вкладок, а затем для каждой удивительной части в этом есть объект в списке на этой вкладке.

В основном: Awesomes->Вкладки

А потом: Awesome.Awesomeparts-> Tabs.Listbox

Ответы [ 2 ]

2 голосов
/ 14 июня 2010

Ниже приведен код для выполнения того, что вы ищете:

public partial class TabWindow : Window
{
    public TabWindow()
    {
        InitializeComponent();

        List<AwesomeClass> items = new List<AwesomeClass>();

        for (int i = 0; i < 10; i++)
        {
            items.Add(new AwesomeClass());
        }

        AwesomeTabs.ItemsSource = items;

        Loaded += new RoutedEventHandler(TabWindow_Loaded);
    }

    // Method 1
    void TabWindow_Loaded(object sender, RoutedEventArgs e)
    {
        FindListBox(AwesomeTabs);
    }

    private void FindListBox(DependencyObject obj)
    {
        Int32 count = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            if (child is ListBox)
            {
                (child as ListBox).SelectionChanged += new SelectionChangedEventHandler(ListBox_SelectionChanged);
            }
            else
            {
                FindListBox(child);
            }
        }
    }

    // Method 2
    private void ListBox_Loaded(object sender, RoutedEventArgs e)
    {
        (sender as ListBox).SelectionChanged += new SelectionChangedEventHandler(ListBox_SelectionChanged);
    }

    void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            MessageBox.Show(e.AddedItems[0].ToString());
        }
        catch (Exception)
        { }
    }
}

class AwesomeClass
{
    static Int32 count = 0;

    public Int32 Index { get; set; }

    public List<AwesomePart> Parts { get; protected set; }

    // Method 3 : Preferred
    private AwesomePart _selectedPart;
    public AwesomePart SelectedPart
    {
        get { return _selectedPart; }
        set
        {
            OnSelectionChanged(_selectedPart, value);
            _selectedPart = value;
        }
    }

    private void OnSelectionChanged(AwesomePart oldValue, AwesomePart newValue)
    {
        if (newValue != null) MessageBox.Show(newValue.ToString());
    }

    public AwesomeClass()
    {
        Index = ++count;

        Parts = new List<AwesomePart>();

        for (int i = 0; i < 10; i++)
        {
            Parts.Add(new AwesomePart());
        }
    }

    public override string ToString()
    {
        return "Tab #" + Index.ToString();
    }
}

class AwesomePart
{
    static Int32 count = 0;

    public Int32 Index { get; set; }

    public AwesomePart()
    {
        Index = ++count;
    }

    public override string ToString()
    {
        return "Part #" + Index.ToString();
    }
}

XAML:

<Grid>
    <TabControl Name="AwesomeTabs">
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ListBox ItemsSource="{Binding Parts}" SelectedItem="{Binding SelectedPart}" Loaded="ListBox_Loaded"></ListBox>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Grid>
0 голосов
/ 14 июня 2010

Привязать список к заголовковому элементу управления контентом.Каждый объект «AwesomeClass» будет установлен как текстовый текст для каждой «вкладки» в элементе управления заголовком.

В элементе управления содержимым, который находится на каждой «вкладке», свяжите свойство DataContext (AwesomeClass), которое обращается кПеречислите в свой элемент управления Listbox.

Имеет смысл?

Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...