2017-09-27 7 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(); 
} 

これが成功し、コントローラによって提供されたデータに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の背景色を設定しようとしましたが、それはどちらか何かを変更していないものの、一見無関係な何かを示していそれで、何が起こっているのかは分かりません。私は、どちらか何も変更しませんでしたDisplayNamePathSelectedValuePath

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

を設定しようとしました。私は、この問題を回避するためにToStringを変更することができます知っているが、私はあなたが、その内容を表示する方法を<GridViewColumn>を指示する必要があり<ListView.View><GridView>を使用している場合、私はちょうど...

+0

@ mm8ええ、そうです。 – 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

何かが欠けている感じを持っていますTestListEntryを生成する。そうでなければ、.ToString()が唯一可能な方法です。なぜなら、すべてのオブジェクトが持つ唯一の情報だからです。
<ListBox.ItemTemplate>を使用するだけでは、特定の列について何も知らないので十分ではありません。

<GridViewColumn Header="test" DisplayMemberBinding="{Binding Path=DisplayName}" /> 

それとも、あなたの<DataTemplate>を使用して<GridViewColumn.CellTemplate>を設定することができます:

使用
<GridViewColumn Header="test"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding DisplayName}" /> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

をあなたがあなたのコメントで述べたように、直接結合を設定するか、表示内容を制御するには

<DataTemplate>は、テキストを表示するだけではなく、セルのスタイルを変更したい場合は、確かに優れたソリューションになります。

関連する問題