7

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

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

谢谢阅读!

4

2 回答 2

8

您可以在您的内部使用字符串数组,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>

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

于 2012-08-17T21:07:41.750 回答
4

您需要像“[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);
于 2017-03-27T02:50:02.023 回答