我正在尝试在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
内设置背景颜色,它也没有改变任何东西,所以不确定那里发生了什么。然后我尝试设置DisplayNamePath
和SelectedValuePath
<ListView ItemsSource="{Binding}" Grid.Row="2" x:Name="researcherListView" DisplayMemberPath="DisplayName" SelectedValuePath="DisplayName">
也没有改变任何东西。我知道我可以改变ToString
来解决这个问题,但我感觉我只是错过了一些东西......
答案 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>
肯定是更好的解决方案,如果您想要为单元格设置样式,而不仅仅是显示文本。