Создание и привязка объектов пользовательского интерфейса в C# вместо XAML (WPF) - PullRequest
0 голосов
/ 27 мая 2020

Приложение, которое я создаю, имеет меню, состоящее из меток / заголовков. Когда вы щелкаете элемент меню (метка xaml), появляется раскрывающийся список с подзаголовками, относящимися к этому элементу. Однако мне нужно сделать это меню настраиваемым через XML. Идея состоит в том, что XML выделяет имена заголовков, а также имена подзаголовков для каждого пункта меню.

<MenuHeaders>
    <Header Value="Something">
        <NestedHeader1>NestedHeader1</NestedHeader1>
        <NestedHeader2>NestedHeader2</NestedHeader2>
    </Header>
    <Header Value="Something Else">
        <NestedHeader1>NestedHeader1</NestedHeader1>
        <NestedHeader2>NestedHeader2</NestedHeader2>
    </Header>
</MenuHeaders>

Я могу прочитать XML с помощью XDocument и привязать свойство зависимости к контексту метки. Проблема в том, что я не знаю, сколько пунктов меню может быть в файле XML. Я хотел избежать создания множества меток и свойств зависимостей для привязки содержимого метки. Вместо создания меток в xaml и привязки к свойству в C# могу ли я создавать элементы пользовательского интерфейса в C# и заполнять их элементами из списка во время выполнения? Ниже приведен код того, как я получаю и привязываю данные к уже существующей метке.

C#:

public string HeaderName
        {
            get => (string)GetValue(HeaderNameProperty);
            set => SetValue(HeaderNameProperty, value);
        }

        public static readonly DependencyProperty HeaderNameProperty =
            DependencyProperty.Register("HeaderName", typeof(string), typeof(MainWindow));

private void LoadHeaders()
    {
        var msg = new List<string>(0);
        XDocument doc = null;

        try
        {
            doc = XDocument.Load("MenuHeaders.xml");
        }
        catch (Exception e)
        {
            msg.Add(string.Format("Unable to open file:{0}", ""));
            msg.Add(e.Message);
        }

        if(doc != null)
        {
            var allHeaders = doc.Descendants("Header").ToList();
            List<string> headers = new List<string>();

            foreach(XNode node in allHeaders)
            {
                XElement element = node as XElement;
                foreach(XAttribute attribute in element.Attributes())
                {
                    headers.Add(attribute.Value);
                }
            }
            HeaderName = headers[0];
        }
    }

XAML:

<StackPanel x:Name="Stack">
        <Label Content="{Binding ElementName=Window, Path=HeaderName}"/>
    </StackPanel>

( Как вы, возможно, заметили, я добавляю в список только атрибуты заголовка, а не подзаголовки. Этот код неполный, но это то, что у меня сейчас есть) Я буду признателен за любую помощь.

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