C# WPF数据绑定到ObservableCollection-ItemTemplate不更改显示值

C# WPF数据绑定到ObservableCollection-ItemTemplate不更改显示值,c#,wpf,listview,data-binding,C#,Wpf,Listview,Data Binding,我试图让WPFListView上的数据绑定正常工作,但是无论出于何种原因,无论我尝试了什么,它都将始终使用ToString提供的值 照目前的情况,我有如下几点: private Controllers.ListController controller; public ListTest( ) { // ... listView.DataContext = controller; } private void Page_Loaded( object sender, RoutedEv

我试图让WPF
ListView
上的数据绑定正常工作,但是无论出于何种原因,无论我尝试了什么,它都将始终使用
ToString
提供的值

照目前的情况,我有如下几点:

private Controllers.ListController controller;
public ListTest( )
{
    // ...
    listView.DataContext = controller;
}
private void Page_Loaded( object sender, RoutedEventArgs e )
{
    var t = new Task( ( ) =>
    {
        // some work to obtain data using controller...
        Dispatcher.Invoke( ( ) =>
        {
            listView.ItemsSource = controller.TestListSource;
        } );
    } );

    t.Start( );
}
这将成功地将
列表视图
绑定到控制器提供的数据,列表视图将显示
IEnumerable
中的每个条目。问题是,我似乎无法更改
ListView
显示每一行的方式<代码>TestListEntry如下所示:

public class TestListEntry
{
    public string GivenName
    {
        get; set;
    }

    public string FamilyName
    {
        get; set;
    }

    public string DisplayName
    {
        get
        {
            return $"{ FamilyName }, { GivenName }";
        }
    }
}
我最初尝试设置
ListBox.ItemTemplate
,如下所示:

<ListView Grid.Row="2" x:Name="listView">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="test" />
        </GridView>
    </ListView.View>
</ListView>
我还尝试在
ItemTemplate
内部的
TextBlock
上设置背景色,但它也没有改变任何内容,因此不确定那里发生了什么。然后我尝试设置
DisplayNamePath
SelectedValuePath

<ListView ItemsSource="{Binding}" Grid.Row="2" x:Name="researcherListView" DisplayMemberPath="DisplayName" SelectedValuePath="DisplayName">

这也没有改变任何事情。我知道我可以将
更改为string
来回避这个问题,但我有一种感觉,我只是缺少了一些东西…

如果您在
中使用
,您需要告诉
如何在生成的单元格中显示其
TestListEntry
的内容。如果没有,那么
.ToString()
是唯一可能的方法,因为这是每个对象仅有的信息。
仅仅使用
是不够的,因为它对特定列一无所知

要控制显示的内容,您可以直接设置绑定,如您在评论中所述:

<GridViewColumn Header="test" DisplayMemberBinding="{Binding Path=DisplayName}" />

或者您可以使用
设置

<GridViewColumn Header="test">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>


如果您想让单元格的样式比只显示文本多一点,那么使用
肯定是更好的解决方案。

@mm8是的,确实如此。它实现为一个
可观察集合
虽然我使用
列表框.ItemTemplate测试了您的代码,但它工作得非常好。您是否为
ListBox
TextBlock
TestListEntry
设置了任何隐式样式或模板?(这也可以解释
System.Windows.Data Information
消息。)如果没有,请隔离问题并发布一条消息,以便我们能够找到罪犯。@haindl抱歉,我正在设置
ListView.View
,但忘了将其包含在我的回答中。可以通过设置
displaymberbinding=“{Binding DisplayName}”
来修复此问题-为什么?是否每个列都从
ListView.View
s
GridViewColumn
继承了它们的绑定(如果设置)?
<GridViewColumn Header="test">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>