2012-12-13 2 views
0

저는 WPF에 매우 익숙합니다. 이렇게 분명하다면 미안하지만 어떻게 완료되었는지 인터넷에 알맞은 예제를 찾지 못하는 것 같습니다.WPF DataGridTemplateColumn, 일반 CellTemplate에 바인딩

MyCollection이라는 DataItem 컬렉션에 바인딩 된 DataGrid가 있습니다. 그리드 (및 응용 프로그램의 다른 곳에서 필 요할)에 여러 개의 열에 사용할 수있는 일반 DataTemplate을 만들고 싶습니다.

예.

<DataGrid ItemsSource="{Binding MyCollection}" AutoGenerateColumns="False" SelectionUnit="Cell" EnableColumnVirtualization="True"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="File path" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
      <DataGridTemplateColumn Header="File path2" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
      <DataGridTemplateColumn Header="File path3" CellTemplate="{StaticResource FileSelectorEditorTemplate}" CellEditingTemplate="{StaticResource FileSelectorEditorTemplate}" /> 
... 

내 DataTemplate을 지금

<DataTemplate x:Key="FileSelectorEditorTemplate"> 
     <Grid> 
      <TextBox Text="{Binding FilePath.PhysicalPath}" HorizontalAlignment="Stretch" Margin="0,0,35,0" /> 
      <Button Content="..." Height="25" Width="25" Margin="0,0,5,0" HorizontalAlignment="Right" Click="FileOpen_Click" /> 
     </Grid> 
    </DataTemplate> 

로 내 응용 프로그램 자원 순간에 정의 된 문제가 그 I는 각각에 대해 서로 다른 바인딩을 적용 할 필요가있는 반면, DataTemplate을에 지정된 바인딩 뷰 모델의 FilePath, FilePath2, FilePath3 속성 하지만 DataGridTemplateColumn에 바인딩을 지정할 수있는 것 같지 않습니까?

나는, 올바른 방향으로

감사를 어떤 포인터를 감사하겠습니다!

+0

을 내가 보인다 당신 http://www.codeproject.com/Articles/43525/WPF-DataGrid-Using-DataTemplates-for-auto-generate에게 –

답변

0

DataGridTemplateColumn의 결합은 CellTemplate에 명시되어있다. 세 개의 열에 대해 다른 바인딩을 원할 경우 각 열에 다른 DataTemplate을 만들어야한다고 말하고 싶습니다. 몇 가지 해결 방법이있을 수 있지만 꽤 될지는 의심 스럽습니다.

편집 : 다른 템플릿을 사용하면 DataTemplateSelector을 사용하여 현재 개체에 맞는 템플릿을 선택할 수 있습니다.

IValueConverter 사용

(그냥 빨리 스케치,하지만 작동합니다) :

<DataTemplate x:Key="GenericTemplate" > 
     <TextBlock FontSize="14" > 
      <TextBlock.Text> 
       <Binding Converter="{StaticResource NewValue}" Path="Me" /> 
      </TextBlock.Text> 
     </TextBlock> 
</DataTemplate> 

public class NewValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     someContainer obj = value as someContainer; 
     if (obj.type == MyType.First) 
      return (string)(obj.val1); 
     else 
      return (string)(obj.val2); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public enum MyType 
{ 
    First, 
    Second 
} 

public class someContainer 
{ 
    public someContainer Me { get; set; } 
    public string val1 { get; set; } 
    public string val2 { get; set; } 
    public MyType type; 

    public someContainer() 
    { 
     Me = this; 
     val1 = "string1"; 
     val2 = "string2"; 
    }  
} 

... 
public ObservableCollection<someContainer> myList {get; set;} 
... 

<StackPanel Margin="0,10,0,0" Orientation="Vertical" Grid.Column="2"> 
     <ItemsControl ItemsSource="{Binding MyList}" ItemTemplate="{StaticResource GenericTemplate}" /> 
    </StackPanel> 
+1

도움이해야한다고 생각 나에게 우스운 이야기. 분명히 동일한 유형의 여러 속성에 대해 응용 프로그램 전체에서 재사용 할 수있는 공통 템플릿을 만드는 방법이 WPF에 있어야합니다. – magritte

+0

아마도'DataTemplate'의 바인딩에'IValueConverter'을 사용할 수 있습니다. 여기에 예제를 게시했습니다 : http://stackoverflow.com/questions/13860046/limit-rows-height-on-both-auto-and-1-in-wpf/13860478#13860478 – JGaarsdal

+0

Jesper에게 감사하지만, 저는 아닙니다. 그게 도움이 될까요? 데이터 템플릿에서 바인딩을 지정하는 방법에 대한 문제가 여전히 남아 있지 않습니까? – magritte