Добавить элемент в меню ListView со страницы (WPF) - PullRequest
0 голосов
/ 25 мая 2018

У меня есть меню Гамбургера, которое реализовано с помощью ListView. Это меню находится в моем MainWindow. Мне нужно добавить новый элемент в этот ListView со страницы. Когда пользователь нажимает кнопку, он добавляет новый элемент в просмотр списка с данными из текстовых полей.Вот код меню XAML

<ListView x:Name="ListViewMenu" Foreground="#FF5C99D6" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="ListViewMenu_SelectionChanged">
    <ListViewItem x:Name="Page1" Height="60">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Page1" VerticalAlignment="Center" Margin="20 10"/>
        </StackPanel>
    </ListViewItem>
    <ListViewItem x:Name="Page2" Height="60">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Page2" VerticalAlignment="Center" Margin="20 10"/>
        </StackPanel>
    </ListViewItem>
</ListView>

Мне нужно добавить такие элементы, как стиль этих элементов. Со страницы, которая открылась во фрейме.У меня есть код для добавления элемента. Это работа, но имя элемента похоже на "WPFProject.Page1 + NameItem ..."

((MainWindow)System.Windows.Application.Current.MainWindow).ListViewMenu.Items.Add(new NameItem((TypeHere.Text)));

1 Ответ

0 голосов
/ 25 мая 2018

У вашего ListView должно быть установлено свойство ItemsSource.Затем вы можете использовать DataTemplate для отображения элементов.Вам также понадобится какой-то ViewModel для хранения вашей коллекции.Это сделает вашу жизнь намного проще.

Ваш ViewModel:

public class HamburgerMenuViewModel
{
    public ObservableCollection<NameItem> MenuItems { get; } = new ObservableCollection<NameItem>();
}

Я также предполагаю, что ваш NameItem выглядит примерно так:

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

Теперь у представления будет DataTemplate, который позволит вам указать только один раз, как выглядит элемент в списке:

<HamburgerMenu>
        <HamburgerMenu.DataContext>
            <local:HamburgerMenuViewModel></local:HamburgerMenuViewModel>
        </HamburgerMenu.DataContext>
        <ListView x:Name="ListViewMenu"
              Foreground="#FF5C99D6"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              SelectionChanged="ListViewMenu_SelectionChanged"
              ItemsSource="{MenuItems}">
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type NameItem}">
                    <StackPanel Orientation="Horizontal" 
                                Height="60">
                        <TextBlock Text="{Binding Name}" 
                                   VerticalAlignment="Center"
                                   Margin="20 10"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </HamburgerMenu>

В ListView для ItemSource установлено значение DataContext's ObservableCollection.когда вы изменяете эту коллекцию, пользовательский интерфейс будет обновляться, чтобы отражать коллекцию.

DataTemplate по сути говорит ListView, как отображать каждый элемент.Внутри DataTemplate, DataContext является элементом в списке, а не DataContext из ListView.

...