C# 如何在WPF中创建特定列数的列表视图?
我想创建一个包含3列的ListView,我正在ListView标记中创建一个GridView,但这并没有提供我想要的结果 附件是我想要的照片 这是我正在使用的一段代码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
[![<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); }
}
}
}