在ListView中显示项目的方式

时间:2013-12-03 08:33:47

标签: c# wpf data-binding

我正在显示对象的集合如下:

using System;
using System.Collections.ObjectModel;

namespace WpfApplication4
{
public partial class MainWindow : Window
{
    public ObservableCollection<class1> collection1 {get;set;}

    public MainWindow()
    {
        InitializeComponent();
        collection1=new ObservableCollection<class1>();
        collection1.Add(new class1());
        collection1.Add(new class1());

        DataContext=this;
    }
}

public class class1
{
    public class1() {;}

    public static implicit operator string(class1 c)
    {
        return "object type of class1";
    }
}

}

WPF文件:

<Window x:Class="WpfApplication4.MainWindow">
    <ListView ItemsSource="{Binding collection1}" />
</Window>

通常它会产生这样的结果:

WpfApplication4.class1

WpfApplication4.class1

但是我想以另一种方式显示它,例如字符串运算符转换的结果。

当然我可以添加到class1字符串元素,但我感兴趣的是有没有办法更快地处理这个问题并且使用的代码更少。

1 个答案:

答案 0 :(得分:1)

如果没有为给定类型定义数据模板,则会在每个绑定的对象上调用ToString(),因此如果您希望从ToString()覆盖class1的代码中返回字符串 public override string ToString() { return (string)this; } 1}}如下(重用隐式转换运算符):

class1

XAML方法是定义数据模板,声明如何呈现TextBlock个对象。在以下示例中,它只包含一个带有固定文本的<Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication4"> <Window.Resources> <DataTemplate DataType="{x:Type local:class1}"> <TextBlock>Class1 object</TextBlock> </DataTemplate> </Window.Resources> <ListView ItemsSource="{Binding collection1}" /> </Window>

class1

或者,不是为<Window.Resources>的所有实例在窗口内全局声明数据模板(即在Window.Resources中),而是可以在本地为ListView定义数据模板。您将删除上一代码的ListView部分,并按以下方式替换<ListView ItemsSource="{Binding collection1}"> <ListView.ItemTemplate> <DataTemplate> <TextBlock>Class1 object</TextBlock> </DataTemplate> </ListView.ItemTemplate> </ListView>

{{1}}