【问题标题】:How to add ListViewItem to WPF multicolumn ListView by hand (no binding) in XAML如何在 XAML 中手动将 ListViewItem 添加到 WPF 多列 ListView(无绑定)
【发布时间】:2012-08-14 07:28:05
【问题描述】:

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

我找到了this answer,但我认为它不能满足我的需求。

感谢阅读!

【问题讨论】:

标签: wpf xaml listview gridview listviewitem


【解决方案1】:

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

【讨论】:

  • 听起来像我要找的东西。现在无法测试,稍后会回来(很可能)接受。谢谢!
  • 我使用了第二个选项,因为它更简洁/更简洁。工作得很好!
【解决方案2】:

您需要像“[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() + "]")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多