WPF MenuItem Содержимое "Имя" - PullRequest
0 голосов
/ 31 мая 2010

У меня МНОГО MenuItem, и я хочу иметь возможность изменять их «содержимое», чтобы оно отображалось в программе. Когда я загружаю программу, их «Имя содержимого» задается в созданном мною сеттере. Но единственная проблема заключается в том, что у меня есть почти сотня объектов MenuItem, и мне нужно, чтобы их отображаемые имена в программе были другими (не сеттер по умолчанию). Я мог бы просто создать более 100 различных «сеттеров» и изменить одну строку в них ... но это очень много времени. Есть ли более простой подход? Я хочу быть в состоянии сделать это в XAML, где я их объявляю. Есть ли способ сделать это? Я искал и пробовал разные попытки, но пока ничего. Может кто-то знает?

EDIT:

Извините, возможно, я немного неясно ..

Я уже создал MenuItems, и они основаны на созданном мною сеттере ... Проблема в том ... Я хочу, чтобы каждый из них по-прежнему основывался на этом сеттере, но имел уникальное "содержимое" / Имя, которое отображается для пользователя ... В настоящее время у всех них есть имя "Content", данное им сеттером, но я ищу способ задать имя содержимого каждого MenuItem через XAML ... это возможно?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 июня 2010

Теперь я понимаю вашу проблему. В общем, я думаю, что было бы очень плохой идеей установить свойство content для каждого из ваших элементов menu в файле XAML. Специально, когда вы имеете дело с сотнями предметов. Лучше использовать функцию привязки данных в WPF и DataTemplates, а не жестко кодировать имена menuItem в файле XAML. Я предложу два решения для вашей проблемы. Первое решение использует подход с выделенным кодом для создания элементов меню, а затем привязывает их к свойству ItemsSource MainMenu без использования dataTemplates. следующий код является кодом для окна:

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

        MenuItems = new ObservableCollection<MenuItem>();

        for (int i = 0; i < 40; i++)
        {
            MenuItem menuItem = new MenuItem();
            menuItem.Header = "MenuItem" + i.ToString();
            MenuItems.Add(menuItem);
        }

        MainMenu.DataContext = this;
    }

    public ObservableCollection<MenuItem> MenuItems
    {
        get;
        set;
    }
}

в этом коде сначала мы создали 40 элементов menuItems, а затем привязали их к свойству DataContext объекта MainMenu. следующий код показывает код XAML окон, включая его объект MainMenu:

<Window x:Class="WpfApplication17.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" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window> 

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

но лучшим решением будет использование dataTemplates, как я делал в следующем коде. При таком подходе вы сначала создали класс для хранения имен пунктов меню. затем с помощью функции шаблона данных WPF вы можете привязать их к элементам MainMenu. код этого решения выглядит следующим образом:

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

        MenuItems = new ObservableCollection<CustomMenuItem>();

        MenuItems.Add(new CustomMenuItem("Item 1"));
        MenuItems.Add(new CustomMenuItem("Item 2"));
        MenuItems.Add(new CustomMenuItem("Item 3"));

        MainMenu.DataContext = this;
    }

    public ObservableCollection<CustomMenuItem> MenuItems
    {
        get;
        set;
    }
}

public class CustomMenuItem
{
    public string Name { get; set; }

    public CustomMenuItem(string name)
    {
        Name = name;
    }
}

в этом коде я использовал класс CustomMenuItem для хранения имен пунктов меню. конструктор MainWindows отвечает за создание элементов меню, но вы можете получить их из других источников, например, из файла XML базы данных. код XAML для MainWindow выглядит так:

<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication17"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:CustomMenuItem}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window>

таким образом, вы можете получить имена элементов меню, например, из файла XML или из других источников данных, и они не будут жестко закодированы в ваш файл XAML. затем вы можете использовать мощные функции шаблонов данных, чтобы просматривать элементы меню так, как вам нравится.

0 голосов
/ 31 мая 2010

Вам вопрос не понятен. Я думаю, что лучший способ создать сотни пунктов меню - это создать их из кода не в XAML. например в цикле foreach. тогда вы можете дать каждому из них уникальное и значимое имя. пожалуйста, опишите вашу проблему более четко.

спасибо

...