2017-09-27 85 views
0

我試圖讓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') 

我也試着設置裏面ItemTemplateTextBlock背景顏色,並沒有任何改變什麼,所以不知道那裏發生了什麼。然後我試圖設置DisplayNamePathSelectedValuePath

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

這並不會改變任何事情。我知道我可以改變ToString來解決這個問題,但我有一種感覺,我只是失去了一些東西......

+0

@ mm8是的,它的確如此。它被實現爲'ObservableCollection '儘管 – Mythrillic

+0

我使用ListBox.ItemTemplate測試了你的代碼,它完美的工作。你有任何爲ListBox,TextBlock或TestListEntry設置的隱式樣式或模板嗎? (這也可以解釋'System.Windows.Data Information'消息。)如果不是,請隔離問題併發布[最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)我們可以找到罪魁禍首。 – haindl

+0

@haindl道歉,我在設置ListView.View,並忘記將它包含在我的答案中。可以通過設置DisplayMemberBinding =「{Binding DisplayName}」來解決這個問題 - 爲什麼?如果您設置了每列是否從ListView.View的'GridViewColumn'繼承它們的綁定? – Mythrillic

回答

1

如果您使用的是你需要告訴<GridViewColumn>如何顯示其內容的<ListView.View>一個<GridView>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>肯定會是更好的解決方案,如果你想讓你的單元格不僅僅是顯示文本而更多一些。

相關問題