2017-10-27 33 views
0

私はDataTemplatesを使用するListViewを持っています。リストビューでこれを使用すると、XAML上の列が定義され、どのように動作するかが分かります。私のDataTemplatesは私のビューで使用されます。しかし、2番目のListViewで同じDataTemplatesを使用したい場合、ListViewに新しい列を追加すると、DataTemplateは使用されません。私は何をすべきか?WPF GridViewColumn.CellTemplate DataTemplate ContentPresenter

最初のListViewのためのXAMLのコードは次のようになります。私は2番目のListViewの列を生成するために使用

<GridViewColumn x:Name="lvSecondColumn" Header="Value" Width="200"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
     <ContentPresenter Content="{Binding}"/> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

私のコードは次のとおりです。

ノーあり参照WPFInspectorで
DataColumn dc = (DataColumn)colum; 

GridViewColumn column = new GridViewColumn(); 
column.DisplayMemberBinding = new Binding(dc.ColumnName)); 
column.Header = dc.ColumnName; 
TestColumns.Columns.Add(column); 

TestListView.ItemsSource = dt.DefaultView; 

私の動的生成列のContentPresenter。 Picture from missing ContentPresenter from WPFInspector ダイナミック列にContentPresenterを追加するにはどうすればいいですか?

答えて

0

BindingとDataTemplateの両方を設定することはできません。 DisplayMemberBinding - :最高から最低 、ドキュメントによると https://msdn.microsoft.com/en-us/library/system.windows.controls.gridviewcolumn.displaymemberbinding(v=vs.110).aspx

次のプロパティは、すべての列のセルの内容とスタイル を定義するために使用されており、優先順序にここに記載されています - CellTemplate - CellTemplateSelector

あなたはバインディングを使用している場合、それがバインドされたオブジェクトの「.ToString()」とテキストボックスを生成します。 ListViewでアイテムの構造を認識している場合は、適切なバインディングを持つDataTemplateを作成できます。しかし、動的に列を生成する場合、これが問題です。

あなたは動的に列のDataTemplateをを生成し、それに結合するのを統合することができます:

public DataTemplate CreateColumnTemplate(string property) 
{ 
    StringReader stringReader = new StringReader(
    @"<DataTemplate 
     xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
      <ContentPresenter Content=""{Binding " + property + @"}""/> 
     </DataTemplate>"); 
    XmlReader xmlReader = XmlReader.Create(stringReader); 
    return XamlReader.Load(xmlReader) as DataTemplate; 
} 

その後、あなたはこのようなあなたの列を生成することができます。

GridViewColumn column = new GridViewColumn(); 
column.CellTemplate = CreateColumnTemplate(dc.ColumnName); 
column.Header = dc.ColumnName; 
TestColumns.Columns.Add(column); 

私は、コードを実行されませんでした間違いはほとんどないかもしれません。

+0

あなたの答えをありがとう。そしてこれは正しい。このために私はテストのために2 ListViewsを使用しています。 XAMLからBindingを使用して動作するものです。他のListViewは、ランタイム時に列を設計しますが、これは正しく機能しません。 ".ToString()"という内容のテキストボックスのみを生成します。しかし、私は動的なテキストボックスでも私のDataTemplateが使用されます。デフォルトのテキストボックスではありません。では、をコード内でどのように設定するのですか? – CPipe

+0

xamlReaderを使用して、列ごとにデータテンプレートを動的にコンパイルできます。私はそれを答えに加えました。 – Dmitry

+0

あなたの問題を解決しましたか? – Dmitry

関連する問題