2009-02-24 3 views
5

이 답변을 찾을 수 없습니다.WPF - 프로그래밍 방식으로 추가 된 GridViewColumns에 대해 DataTemplate을 설정하십시오.

다양한 열 수를 포함 할 수있는 WPF ListView 컨트롤이 있습니다. 예를 들어 ID, 이름, 가격, NumberInStock, Manufacturer를 표시하는 제품을 포함 할 수있는 고객 데이터를 표시하거나 열 ID, 이름, 전자 메일 등을 표시 할 수 있습니다.

내가 원하는 것은 특정 열이 데이터를 다르게 표시하는 것입니다. 예를 들어 NumberInStock 열의 값으로 'Yes'또는 'No'를 인쇄하는 대신 깔끔한 이미지를 표시하고 싶습니다.

바인딩 할 고정 된 이름을 가진 고정 된 양의 열이 있다면이 방법이 쉽습니다. 특정 열에 대해 DataTemplate을 정의하면이 열을 사용하여 열의 뷰를 정의 할 수 있습니다. 그러나, 나는 나의 상황에서 그것을하는 방법을 볼 수 없다.

저는 WPF에 매우 익숙합니다. 제 접근 방식이 좋지 않을 때 실례합니다 :-) 제 XAML에서 ListView 컨트롤을 정의했습니다. 이것은 꽤 비어 있습니다. 뒤에 내 코드에서, 내가 사용

// get all columns from my objects (which can be either a Customer of Product) 
    foreach (string columnName in MyObject.Columns) 
     { 
      GridViewColumn column = new GridViewColumn(); 
      // Bind to a property of my object 
      column.DisplayMemberBinding = new Binding("MyObject." + columnName); 
      column.Header = columnName; 
      column.Width = 50; 
      // If the columnname is number of stock, set the template to a specific datatemplate defined in XAML 
      if (columnName == "NumberInStock") 
      column.CellTemplate = (DataTemplate)FindResource("numberInStockImageTemplate"); 
      explorerGrid.Columns.Add(column); 
     } 

좋아, 내가 (! 당신이 어떤 조언이 있다면, 제발) 가장 큰 문제는 내가 어떤을 볼 수 있다는 것입니다하지만 조금 더 예뻐 할 수있는 확신 열의 차이. 그냥 'NumberInStock'열의 텍스트 값을 표시합니다. 내 DataTemplate이는 XAML에 정의되어

물론
<Window.Resources> 
<DataTemplate x:Name="NumberInStock" x:Key="NumberInStock"> 
     <Border BorderBrush="Red" BorderThickness="2.0"> 
     <DockPanel> 
      <Image Width="24" Height="24" Margin="3,0" Source="..\Images\instock.png" /> 
     </DockPanel> 
     </Border> 
</DataTemplate> 
</Window.Resources> 

, 나는 아직도 그것을 표시 할 기능을 추가해야 할 것 '예'또는 '아니요'이미지 NumberInStock의 값에 따라,하지만 그 단계 2 정말. 내 ListView에서 이미지와 빨간색 경계선을 보게되어 기쁩니다! 사전에

감사합니다, 즐즈

답변

7

이것은 잠시 나를 위태롭게했다.

DisplayMemberBindingCellTemplate은 상호 배타적입니다. DisplayMemberBinding을 지정하면 CellTemplate이 무시됩니다. MSDN에서

:

다음과 같은 속성

는 모두 열 셀의 내용과 스타일을 정의하는 을 사용하고 있으며, 가장 높은 가장 낮은에서, 우선 순위의 순서로 다음과 같습니다 :

* DisplayMemberBinding 
* CellTemplate 
* CellTemplateSelector 

또한 이것에 대해 C# Disciples post를 참조하십시오.

+0

고마워, 그게 실제로 문제 같아. SP1에 포함 된 DataGrid 컨트롤을 사용하기 위해 이미 코드를 편집했습니다. 어쨌든 내 상황에 더 적합 할 수 있습니다. 그러나 이것이 올바른 해결책입니다. 많은 감사합니다! – Razzie

0

나는 문제가 당신이 FindResource()에 전달하는 문자열을 사용하면 XAML에 정의 된 자원의 키와 일치하지 않는다는 것입니다 생각합니다. 대신 "NumberInStock"을 전달하고 작동하는지 확인하십시오.

+0

샤프를 삽입 할 수있는 가장 쉬운 방법입니다! 불행히도, 그것은 단지 내 복사 - 붙여 넣기 편집을위한 질문 오류 일뿐입니다.그것은 내 코드에서 올바른 키를 가리 킵니다. 또한 FindResource (string)는 키를 찾을 수 없을 때 예외를 throw합니다. 어쨌든 고마워! – Razzie

2

이 사진

 GridViewColumn column = new GridViewColumn { Header = "IM" };    
     DataTemplate template = new DataTemplate(); 

     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Grid)); 
     template.VisualTree = factory; 
     FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image)); 

     Binding newBinding = new Binding("IMG"); 
     imgFactory.SetBinding(Image.SourceProperty,newBinding); 
     imgFactory.SetValue(Image.WidthProperty,15.0); 
     imgFactory.SetValue(Image.HeightProperty, 15.0); 

     factory.AppendChild(imgFactory); 
     column.CellTemplate = template; 
     view.Columns.Add(column); 

     ListViewMain.View = view; 

+0

더 많은 설명이 유용 할 것이지만 이것은 올바른 대답으로 이끌어줍니다 (제 경우). 간단히 말해서 : _ 열에 대한 컨텐츠 작성자를 생성하므로 공장에서 정의 된 컨트롤을 생성하기 위해 팩토리가 호출되는 각 행 ._ 감사합니다 .. +1 –

+0

이 스타일은 저에게 효과적입니다. 참고 : 내 바인딩은 자식 개체 속성의 속성에 대한 것이므로 다음과 같이 보입니다 :'Binding newBinding = new Binding ("ChildProp.SubProp"); newBinding.Converter = 새로운 MyConverter();' –