我有一个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”。 任何人都知道如何解决它?非常感谢你。
答案 0 :(得分:2)
当给定要显示的对象时,ListView
(以及其他所有控件)将显示调用ToString
的结果。
对于标准类,这是它的合格名称;您的示例中的Project.Views.Row。
有两种方法可以解决这个问题:
不要添加对象。而是根据需要格式化字符串,即:
list1.Items.Add(String.Format({0}:{1}, row.Name1, row.Name2));
以正确的方式执行此操作并使用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>
绑定ItemsSource
实际上不是 ,但由于我们正在以正确的方式做所有事情,所以你应该这样做,这样你就不会直接从代码中操作UI。