Как в WPF динамически загружаемый элемент может получить доступ к своим родительским элементам?

В Window1.xaml у меня есть меню и область отображения:

<Menu x:Name="TheMenu" Width="Auto" Height="25" DockPanel.Dock="Top"/>
<ItemsControl x:Name="MainContent" DockPanel.Dock="Top"/>

В Window1.xaml.cs я динамически загружаю пункт меню:

MenuItem menuItemEmployees = new MenuItemEmployees(this);
TheMenu.Items.Add(menuItemEmployees);

В MenuItemEmployees.xaml.cs я внедряю Window1, но как получить доступ к его элементам?

using System.Windows.Controls;
using System.Windows;

namespace TestContainer1
{
    public partial class MenuItemEmployees : MenuItem
    {
        public MenuItemEmployees(Window1 window1)
        {
            InitializeComponent();
        }

        private void Create_Employee(object sender, System.Windows.RoutedEventArgs e)
        {
            TextBlock textBlock = new TextBlock();
            textBlock.Text = "New Customer";

            //how can I access my ItemsControl element in "Window1" here?
            //pseudo code:
            Window1.Children["MainContent"].Add(textBlock);
        }
    }
}

ОТВЕЧАТЬ:

Хорошо, я понял, это была просто оплошность, я забыл создать внутреннюю переменную для окна1. Но я оставлю этот код здесь, может быть интересно, очень легко передать главное окно в элементы управления, чтобы динамически добавленные элементы управления могли получить доступ к другим элементам в окне, своего рода инъекция зависимостей для бедняков без интерфейсов:

using System.Windows.Controls;
using System.Windows;

namespace TestContainer1
{
    public partial class MenuItemEmployees : MenuItem
    {
        private Window1 _window1;

        public MenuItemEmployees(Window1 window1)
        {
            InitializeComponent();
            _window1 = window1;
        }

        private void Create_Employee(object sender, System.Windows.RoutedEventArgs e)
        {
            TextBlock textBlock = new TextBlock();
            textBlock.Text = "New Customer";

            _window1.MainContent.Items.Add(textBlock);
        }
    }
}

person Edward Tanguay    schedule 17.03.2009    source источник


Ответы (1)


Попробуйте что-нибудь вроде этого

Menu yourMenu = ItemContainerGenerator.ContainerFromItem(this) as Menu;
Window yourWindow = Menu.Parent as Window;    

ContainerFromItem — это статический метод, который делает то, что вы хотите, см. рекламу Microsoft здесь.

person MrTelly    schedule 17.03.2009