Приложение, которое я создаю, имеет меню, состоящее из меток / заголовков. Когда вы щелкаете элемент меню (метка 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>
( Как вы, возможно, заметили, я добавляю в список только атрибуты заголовка, а не подзаголовки. Этот код неполный, но это то, что у меня сейчас есть) Я буду признателен за любую помощь.