我試圖讓WPF ListView
上的數據綁定能夠正常工作,但無論出於何種原因,它總是會使用ToString
提供的值,而不管我嘗試過什麼。WPF數據綁定到ObservableCollection - ItemTemplate不改變顯示的值
由於是,我有類似如下:
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'儘管 –
Mythrillic
我使用ListBox.ItemTemplate測試了你的代碼,它完美的工作。你有任何爲ListBox,TextBlock或TestListEntry設置的隱式樣式或模板嗎? (這也可以解釋'System.Windows.Data Information'消息。)如果不是,請隔離問題併發布[最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)我們可以找到罪魁禍首。 – haindl
@haindl道歉,我在設置ListView.View,並忘記將它包含在我的答案中。可以通過設置DisplayMemberBinding =「{Binding DisplayName}」來解決這個問題 - 爲什麼?如果您設置了每列是否從ListView.View的'GridViewColumn'繼承它們的綁定? – Mythrillic