【发布时间】:2017-09-27 11:13:50
【问题描述】:
我正在尝试让 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')
我还尝试在ItemTemplate 内部的TextBlock 上设置背景颜色,它也没有改变任何东西,所以不确定那里发生了什么。然后我尝试设置DisplayNamePath 和SelectedValuePath
<ListView ItemsSource="{Binding}" Grid.Row="2" x:Name="researcherListView" DisplayMemberPath="DisplayName" SelectedValuePath="DisplayName">
这也没有改变任何东西。我知道我可以更改 ToString 来解决这个问题,但我觉得我只是错过了一些东西......
【问题讨论】:
-
@mm8 是的,确实如此。它被实现为
ObservableCollection<TestListEntry>虽然 -
我使用
ListBox.ItemTemplate测试了您的代码,它运行良好。您是否为ListBox、TextBlock或TestListEntry设置了任何隐式样式或模板? (这也可以解释System.Windows.Data Information消息。)如果不是,请隔离问题并发布Minimal, Complete, and Verifiable example,以便我们找到罪魁祸首。 -
@haindl 道歉,我正在设置
ListView.View并忘记将其包含在我的答案中。可以通过设置DisplayMemberBinding="{Binding DisplayName}"来修复 - 为什么?如果您设置,每列是否从ListView.ViewsGridViewColumn继承其绑定?
标签: c# wpf listview data-binding