C# 如何在WPF中创建特定列数的列表视图?

C# 如何在WPF中创建特定列数的列表视图?,c#,wpf,xaml,listview,data-binding,C#,Wpf,Xaml,Listview,Data Binding,我想创建一个包含3列的ListView,我正在ListView标记中创建一个GridView,但这并没有提供我想要的结果 附件是我想要的照片 这是我正在使用的一段代码 [![<ListView Name="List1" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,70,0,0" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.Ve

我想创建一个包含3列的ListView,我正在ListView标记中创建一个GridView,但这并没有提供我想要的结果

附件是我想要的照片

这是我正在使用的一段代码

[![<ListView Name="List1" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,70,0,0" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" Background="Transparent" BorderThickness="0" RenderTransformOrigin="-1.33,-0.562" SelectionChanged="ListView_SelectionChanged">
            <ListView.View>
                <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <DockPanel HorizontalAlignment="Right" Height="200" Width="200" LastChildFill="False" VerticalAlignment="Top">
                                    <StackPanel Orientation="Vertical">
                                        <Grid>
                                            <Label Content="{Binding username}" Width="100" Height="200" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
                                            <Image Source="{Binding imageSource}" Width="100" Height="100"/>
                                        </Grid>
                                    </StackPanel>
                                </DockPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <DockPanel HorizontalAlignment="Right" Height="200" Width="200" LastChildFill="False" VerticalAlignment="Top">
                                    <StackPanel Orientation="Vertical">
                                        <Grid>
                                            <Label Content="{Binding username}" Width="100" Height="200" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
                                            <Image Source="{Binding imageSource}" Width="100" Height="100"/>
                                        </Grid>
                                    </StackPanel>
                                </DockPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <DockPanel HorizontalAlignment="Right" Height="200" Width="200" LastChildFill="False" VerticalAlignment="Top">
                                    <StackPanel Orientation="Vertical">
                                        <Grid>
                                            <Label Content="{Binding username}" Width="100" Height="200" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
                                            <Image Source="{Binding imageSource}" Width="100" Height="100"/>
                                        </Grid>
                                    </StackPanel>
                                </DockPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>][1]][1]
[[
][1]][1]

更好的方法是使用
UniformGrid
作为
列表视图的
ItemsPanel

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
           <UniformGrid Columns="3" />
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    ...
</ListView>
查看模型:

namespace ColumnsTest
{
    using System.Windows.Input;
    using AgentOctal.WpfLib;
    using AgentOctal.WpfLib.Commands;

    class MainWindowVm : ViewModel
    {
        public MainWindowVm()
        {
            People = new ObservableCollection<PersonVm>();
        }

        public ObservableCollection<PersonVm> People { get; }

        private ICommand _addPersonCommand;
        public ICommand AddPersonCommand
        {
            get
            {
                return _addPersonCommand ?? (_addPersonCommand = new SimpleCommand((obj) =>
                                        {
                                            People.Add(new PersonVm() { Name = Guid.NewGuid().ToString() });
                                        }));
            }
        }

    class PersonVm : ViewModel
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { SetValue(ref _name, value); }
        }

    }
}
namespace ColumnsTest
{
使用System.Windows.Input;
使用agentottal.WpfLib;
使用agentottal.WpfLib.Commands;
类MainWindowVm:ViewModel
{
公共MainWindowVm()
{
人员=新的可观察集合();
}
公共可观察集合人员{get;}
私有ICommand _addPersonCommand;
公共ICommand AddPersonCommand
{
得到
{
return\u addPersonCommand???(\u addPersonCommand=new SimpleCommand((obj)=>
{
添加(newpersonvm(){Name=Guid.NewGuid().ToString()});
}));
}
}
类PersonVm:ViewModel
{
私有字符串\u名称;
公共字符串名
{
获取{return\u name;}
set{SetValue(ref _name,value);}
}
}
}
它产生以下结果:

我看不到附加图片以查看您想要的结果…@KFactory请再次检查。好的,谢谢,您的代码正在编译吗?我们可以看看您得到了什么吗?是的,我的代码正在编译,我附加了另一张我的结果图片。这是一个简单的解决方案。我直接实现了我的愿望:-)我欣赏一张便条,然后您也可以使用列表框,ListView的基类。
ListView
优于
ListBox
的主要好处是
ListView
允许您拥有数据的多个视图。如果您不需要该功能,请坚持使用@Clemens提到的
ListBox
;它是一个更轻的控件,性能更高。听起来不错。我是现在使用ListView和is完美地解决了我的问题。顺便说一句,我非常喜欢WPF的
ListBox
足够聪明,可以在执行此操作时自动找出左、右、上、下键的正确行为。
namespace ColumnsTest
{
    using System.Windows.Input;
    using AgentOctal.WpfLib;
    using AgentOctal.WpfLib.Commands;

    class MainWindowVm : ViewModel
    {
        public MainWindowVm()
        {
            People = new ObservableCollection<PersonVm>();
        }

        public ObservableCollection<PersonVm> People { get; }

        private ICommand _addPersonCommand;
        public ICommand AddPersonCommand
        {
            get
            {
                return _addPersonCommand ?? (_addPersonCommand = new SimpleCommand((obj) =>
                                        {
                                            People.Add(new PersonVm() { Name = Guid.NewGuid().ToString() });
                                        }));
            }
        }

    class PersonVm : ViewModel
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { SetValue(ref _name, value); }
        }

    }
}