2017-10-27 24 views
0

DataTemplates를 사용하는 ListView가 있습니다. 내가 ListView에서 이것을 사용하면 XAML을 통해 열이 정의되어 어떻게 작동 하는지를 알 수있다. 내 DataTemplates 내보기에서 사용됩니다. 하지만 두 번째 ListView에서 동일한 DataTemplates를 사용하려는 경우 ListView에 새 열을 추가합니다.이 열은 DataTemplate을 사용하지 않습니다. 나는 무엇을해야합니까?WPF GridViewColumn.CellTemplate DataTemplate ContentPresenter

첫 ListView에 대한 XAML의 코드는 다음과 같습니다

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

내가 두 번째의 ListView의 열을 생성하기 위해 사용하는 내 코드는 다음과 같습니다 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에서 항목의 구조를 알고 있다면 적절한 바인딩으로 DataTemplates를 만들 수 있습니다. 그러나 동적으로 열을 생성 할 때 이것은 문제입니다.

당신은 동적으로 컬럼에 대한 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 개의 ListView를 테스트에 사용했습니다. 하나는 XAML에서 Binding을 사용하고 작동하는 곳입니다. 다른 ListView 런타임에서 열을 디자인하고이 올바르게 작동하지 않습니다. ".ToString()"내용이있는 텍스트 상자 만 생성합니다. 하지만 동적 TextBox 내 DataTemplate도 사용하고 싶습니다. 기본 텍스트 상자가 아닙니다. 그렇다면 을 어떻게 설정해야할까요? – CPipe

+0

xamlReader를 사용하여 열당 데이터 템플릿을 동적으로 컴파일 할 수 있습니다. 나는 대답에 그것을 추가했다. – Dmitry

+0

문제는 해결 되었습니까? – Dmitry