WPF GridView具有动态定义

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))
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设包含值的第二个数组将是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>
Run Code Online (Sandbox Code Playgroud)


Tom*_*try 5

谢谢,这非常有帮助.

我用它来创建动态版本如下.我按照你的建议创建了列标题:

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;
}
Run Code Online (Sandbox Code Playgroud)

在XAML中非常简单地设置ListView:

<ListView Name="myListview" DockPanel.Dock="Left"/>
Run Code Online (Sandbox Code Playgroud)

为ObservableCollection创建了一个包装类来保存我的数据:

public class MyCollection : ObservableCollection<List<String>>
{
    public MyCollection()
        : base()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

并将我的ListView绑定到它:

results = new MyCollection();

Binding binding = new Binding();
binding.Source = results;
myListview.SetBinding(ListView.ItemsSourceProperty, binding);
Run Code Online (Sandbox Code Playgroud)

然后填充它,只是清除任何旧数据并添加新数据的情况:

results.Clear();
List<String> details = new List<string>();
for (int ii=0; ii < externalDataCollection.Length; ii++)
{
    details.Add(externalDataCollection[ii]);
}
results.Add(details);
Run Code Online (Sandbox Code Playgroud)

可能有更简洁的方法,但这对我的应用程序非常有用.再次感谢.