C# WPF数据绑定到ObservableCollection-ItemTemplate不更改显示值
我试图让WPFC# 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
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
sGridViewColumn
继承了它们的绑定(如果设置)?
<GridViewColumn Header="test">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding DisplayName}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>