Tom*_*try 12 wpf listview gridview
我想使用ListView的GridView模式来显示我的程序将从外部源接收的一组数据.数据将包含两个数组,一个是列名,另一个是用于填充控件的字符串值.
我没有看到如何创建一个合适的类,我可以用作ListView中的Item.我知道填充Items的唯一方法是将它设置为具有表示列的属性的类,但我不知道运行时之前的列.
我可以动态创建一个ItemTemplate,如下所述:在运行时DYNAMICALLY创建WPF ItemTemplate但它仍然让我不知道如何描述实际数据.
任何帮助感激不尽.
Rob*_*nee 12
您可以使用如下方法在给定第一个数组的情况下动态地将GridViewColumns添加到GridView:
private void AddColumns(GridView gv, string[] columnNames)
{
    for (int i = 0; i < columnNames.Length; i++)
    {
        gv.Columns.Add(new GridViewColumn
        {
            Header = columnNames[i],
            DisplayMemberBinding = new Binding(String.Format("[{0}]", i))
        });
    }
}
我假设包含值的第二个数组将是ROWS*COLUMNS长度.在这种情况下,您的项目可以是长度为COLUMNS的字符串数组.您可以使用Array.Copy或LINQ来拆分数组.这个原则在这里展示:
<Grid>
    <Grid.Resources>
        <x:Array x:Key="data" Type="{x:Type sys:String[]}">
            <x:Array Type="{x:Type sys:String}">
                <sys:String>a</sys:String>
                <sys:String>b</sys:String>
                <sys:String>c</sys:String>
            </x:Array>
            <x:Array Type="{x:Type sys:String}">
                <sys:String>do</sys:String>
                <sys:String>re</sys:String>
                <sys:String>mi</sys:String>
            </x:Array>
        </x:Array>
    </Grid.Resources>
    <ListView ItemsSource="{StaticResource data}">
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Path=[0]}" Header="column1"/>
                <GridViewColumn DisplayMemberBinding="{Binding Path=[1]}" Header="column2"/>
                <GridViewColumn DisplayMemberBinding="{Binding Path=[2]}" Header="column3"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
谢谢,这非常有帮助.
我用它来创建动态版本如下.我按照你的建议创建了列标题:
private void AddColumns(List<String> myColumns)
{
    GridView viewLayout = new GridView();
    for (int i = 0; i < myColumns.Count; i++)
    {
        viewLayout.Columns.Add(new GridViewColumn
        {
            Header = myColumns[i],
            DisplayMemberBinding = new Binding(String.Format("[{0}]", i))
        });
    }
    myListview.View = viewLayout;
}
在XAML中非常简单地设置ListView:
<ListView Name="myListview" DockPanel.Dock="Left"/>
为ObservableCollection创建了一个包装类来保存我的数据:
public class MyCollection : ObservableCollection<List<String>>
{
    public MyCollection()
        : base()
    {
    }
}
并将我的ListView绑定到它:
results = new MyCollection();
Binding binding = new Binding();
binding.Source = results;
myListview.SetBinding(ListView.ItemsSourceProperty, binding);
然后填充它,只是清除任何旧数据并添加新数据的情况:
results.Clear();
List<String> details = new List<string>();
for (int ii=0; ii < externalDataCollection.Length; ii++)
{
    details.Add(externalDataCollection[ii]);
}
results.Add(details);
可能有更简洁的方法,但这对我的应用程序非常有用.再次感谢.