如何在XAML中手动(不使用绑定)向WPF多列ListView添加ListViewItem?

8

我在 Expression Blend 中遇到了 ListView 设计问题,比我预想的难度更大。

我想仅使用 XAML 来绘制一个屏幕。这将不会在应用程序中运行,只是一个静态设计研究,应在 Expression Blend 的设计窗口中进行渲染,仅此而已。

目前我已经完成了以下内容:

<ListView x:Name="examList" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Date" Width="Auto"/>
            <GridViewColumn Header="Setup" Width="Auto"/>
            <GridViewColumn Header="Protocol" Width="Auto" />
            <GridViewColumn Header="Channels" Width="Auto"/>
            <GridViewColumn Header="Duration" Width="Auto"/>
        </GridView>
    </ListView.View>

    <ListViewItem>
        <TextBlock Text="stuff" />  <!-- what should I put here??? -->
    </ListViewItem>
</ListView>

问题是:我不知道该如何为每个字段(GridView中的每一列)创建只有一个字符串或数字值的ListViewItems。
我会感激任何帮助,无论是否需要代码,但我的工作流程的必要条件是它可以在Expression Blend内在设计时呈现,而不需要运行应用程序,并且最好不是从另一个文件绑定数据,而是直接手动输入到XAML中(实际上我想要这样)。
我找到了这个答案,但它不符合我的需求,我认为。
感谢阅读!

像这个链接中的内容可以吗? - Patrick
2个回答

9

你可以在ListViewItem中使用字符串数组,并使用DisplayMemberBinding指定应将哪个索引显示在哪个列中。

<ListView x:Name="examList" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Date" Width="Auto" 
                            DisplayMemberBinding="{Binding [0]}"/>
            <GridViewColumn Header="Setup" Width="Auto" 
                            DisplayMemberBinding="{Binding [1]}"/>
            <GridViewColumn Header="Protocol" Width="Auto" 
                            DisplayMemberBinding="{Binding [2]}"/>
            <GridViewColumn Header="Channels" Width="Auto" 
                            DisplayMemberBinding="{Binding [3]}" />
            <GridViewColumn Header="Duration" Width="Auto" 
                            DisplayMemberBinding="{Binding [4]}"/>
        </GridView>
    </ListView.View>

    <ListViewItem>
        <x:Array Type="{x:Type sys:String}">
                <sys:String>This is Date</sys:String>
                <sys:String>This is Setup</sys:String>
                <sys:String>This is Protocol</sys:String>
                <sys:String>This is Channels</sys:String>
                <sys:String>This is Duration</sys:String>
            </x:Array>        
    </ListViewItem>
</ListView>

其中sys:表示xmlns:sys="clr-namespace:System;assembly=mscorlib"

或者您可以创建自己的数据类型来保存这些值:

public class Exam
{
    public string Date { get; set; }

    public string Setup { get; set; }

    //...
}

然后在 ListViewItem 中使用它:

<ListView x:Name="examList" SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Date" Width="Auto" 
                            DisplayMemberBinding="{Binding Date}"/>
            <GridViewColumn Header="Setup" Width="Auto" 
                            DisplayMemberBinding="{Binding Setup}"/>    
        </GridView>
    </ListView.View>

    <ListViewItem>
        <local:Exam Date="2001/1/1" Setup="Some setup" />
    </ListViewItem>
</ListView>

local:指向你的Exam类命名空间。


听起来像我在找的东西。现在无法测试,稍后会回来(很可能)接受。谢谢! - heltonbiker
我使用了第二个选项,因为它更简洁。运行得非常好! - heltonbiker

5
你需要类似于“[0]”的索引绑定。
<Grid>
    <ListView x:Name="lv" />
</Grid>



lv.Items.Clear();
var gv = new GridView();
lv.View = gv;

var columns = new List<string> { "Date", "Setup", "Protocol", "Channels", "Duration" };
for(int index = 0; index < columns.Count; index++)
{
    gv.Columns.Add(new GridViewColumn
    {
        Header = columns[index],
        DisplayMemberBinding = new Binding("[" + index.ToString() + "]")
    });
}

// Populate list
var row1 = new List<string> { "Date1", "Setup1", "Protocol1", "Channels1", "Duration1" };
var row2 = new List<string> { "Date2", "Setup2", "Protocol2", "Channels2", "Duration2" };
lv.Items.Add(row1);
lv.Items.Add(row2);

这是一个未被重视的答案!但它恰好是我在寻找的缺失链接DisplayMemberBinding = new Binding("[" + index.ToString() + "]") - NappingRabbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接