2017-09-27 5 views
0

내가 무슨 이유에 대해 올바르게하지만 작동하는 WPF ListView에 데이터 바인딩을 얻으려고 변경하지, 그것은 항상 내가 무엇을 시도했다 상관없이 ToString에서 제공하는 값을 사용합니다.WPF 데이터 바인딩 - 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(); 
} 

이 성공적으로 컨트롤러와 IEnumerable<TestListEntry> 내부의 모든 항목이 표시됩니다 목록보기가 제공하는 데이터에 ListView을 결합 :

은 그대로, 나는 다음과 같은 일을합니다. 문제는 각 행에 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와 중 아무 것도 변경하지 않은

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

SelectedValuePath을 설정했습니다. 나는이 문제를 해결하기 위해 ToString을 변경할 수 있습니다 알고 있지만 난 그냥 뭔가를 누락 느낌 ...이

+0

@ mm8 예, 그렇습니다. – Mythrillic

+0

'ListBox.ItemTemplate'을 사용하여 코드를 테스트했는데 완벽하게 작동합니다. 'ListBox','TextBlock' 또는'TestListEntry'에 대해 암묵적인 스타일이나 템플릿을 설정 했습니까? (System.Windows.Data 정보 메시지도 설명 할 것입니다.) 그렇지 않다면 문제를 격리하고 [최소한의 완전하고 검증 가능한 예제] (https://stackoverflow.com/help/mcve)를 게시하십시오. 우리는 범인을 찾을 수 있습니다. – haindl

+0

@haindl 사과, 나는 ListView.View를 설정하고 내 대답에 그것을 포함하는 것을 잊었다. 'DisplayMemberBinding = "{DisplayName DisplayName}"을 설정하여 고칠 수있는 것은 무엇입니까?ListView.View'S'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>은 텍스트를 표시하는 것보다 조금 더 스타일을 지정하려는 경우 반드시 더 나은 솔루션이 될 것입니다.