如何在XAML中手动(无绑定)将ListViewItem添加到WPF多列ListView中



我在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中(我不介意,实际上我想要它)。

我找到了这个答案,但我认为它并不能满足我的需要。

感谢阅读!

您可以在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类命名空间。

您需要像"[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);

最新更新