【问题标题】:Add item in ListView menu from Page (WPF)从页面 (WPF) 在 ListView 菜单中添加项目
【发布时间】:2018-05-25 17:11:05
【问题描述】:

我有使用 ListView 实现的汉堡菜单。这个菜单在我的 MainWindow 上。我需要从 Page 的这个 ListView 中添加新项目。当用户单击按钮时,它会在 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)));

【问题讨论】:

    标签: c# wpf listview menu add


    【解决方案1】:

    你的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 的 ItemsSource 设置为 DataContext 的 ObservableCollection。当您修改此集合时,UI 将更新以反映该集合。

    DataTemplate 本质上是告诉ListView 如何显示每个项目。在DataTemplate 内部,DataContext 是列表中的一个项目,而不是ListViewDataContext

    【讨论】:

    • 感谢您的回复。我是 WPF 的新手(我正在尝试将程序从 WinForms 重写为 WPF)。您能否解释一下 标签的来源? (对不起我的英语)。如果它的某些框架是我没有使用框架来实现菜单。
    • @Ricarnev 这只是我放在那里的一个标签,但是将DataContext 放在ListView 的父级上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多