WPF - 填写ListView

时间:2014-11-05 22:20:06

标签: c# listview add

我有一个2列的ListView,我正在尝试用以下代码用IDictionary填充它。

System.Collections.IDictionary entryList = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User);

foreach (System.Collections.DictionaryEntry de in entryList)
{
    Row row = new Row();
    row.Name1 = (string)de.Key;
    row.Name2 = (string)de.Value;
    this.list1.Items.Add(row);
}

public class Row
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

XAML:

<ListView x:Name="varList"
    Grid.ColumnSpan="1"
    HorizontalAlignment="Left"
    VerticalAlignment="Top"
    Height="400"
    Width="500"
    Margin="0, 30, 0, 0">

    <ListView.View>
        <GridView>
            <GridViewColumn Width="150" Header="Name" />
            <GridViewColumn Width="350" Header="Path" />
        </GridView>
    </ListView.View>
</ListView>

但每个行和列都填充了“Project.Views.Row”。 任何人都知道如何解决它?非常感谢你。

1 个答案:

答案 0 :(得分:2)

当给定要显示的对象时,ListView(以及其他所有控件)将显示调用ToString的结果。

对于标准类,这是它的合格名称;您的示例中的Project.Views.Row。

有两种方法可以解决这个问题:

  1. 不要添加对象。而是根据需要格式化字符串,即:

    list1.Items.Add(String.Format({0}:{1}, row.Name1, row.Name2));
    
  2. 正确的方式执行此操作并使用MVVM。在这种情况下,您的XAML需要一个数据模板:

    <ListView ItemsSource="{Binding Rows}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                   <TextBlock Text="{Binding Name1}"/>
                   <TextBlock Text="{Binding Name2}"/>
                </StackPanel>
            </DataTemplate>
        <ListView.ItemTemplate>
     </ListView>
    

    对于网格视图:

     <ListView.View>
        <GridView>
           <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name1}" />
           <GridViewColumn Header="Path" DisplayMemberBinding="{Binding Name2}"/>
        </GridView>
     </ListView.View>
    
  3. 绑定ItemsSource实际上不是 ,但由于我们正在以正确的方式做所有事情,所以你应该这样做,这样你就不会直接从代码中操作UI。