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

时间:2017-09-27 11:13:51

标签: c# wpf listview data-binding

我正在尝试在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( );
}

这成功地将ListView绑定到控制器提供的数据,列表视图将显示IEnumerable<TestListEntry>内的每个条目。问题是,我似乎无法改变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>

然而,这并没有改变任何事情。打开WPF绑定调试也没有显示任何关于错误的内容,确实显示了看似无关紧要的东西

System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListViewItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ListViewItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

我还尝试在TextBlock ItemTemplate内设置背景颜色,它也没有改变任何东西,所以不确定那里发生了什么。然后我尝试设置DisplayNamePathSelectedValuePath

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

也没有改变任何东西。我知道我可以改变ToString来解决这个问题,但我感觉我只是错过了一些东西......

1 个答案:

答案 0 :(得分:1)

如果您在<GridView>中使用<ListView.View>,则需要告诉<GridViewColumn>如何在生成的单元格中显示TestListEntry的内容。如果你没有,那么.ToString()是唯一可行的方式,因为它是每个对象拥有的唯一信息。
使用<ListBox.ItemTemplate>还不够,因为它对特定列没有任何了解。

要控制显示的内容,您可以直接设置绑定,就像您在评论中提到的那样:

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

或者您可以使用<GridViewColumn.CellTemplate>

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

使用<DataTemplate>肯定是更好的解决方案,如果您想要为单元格设置样式,而不仅仅是显示文本。