2010-06-09 4 views
1

런타임시 열이 채워지는 ListView가있는 C#에서 WPF 프로그램을 작성하고 있습니다. ListView의 GridViewColumn 개체에 사용자 지정 DataTemplate을 사용하고 싶습니다.런타임시 WPF DataTemplate에서 바인딩 경로 할당

예를 들어, 열 수가 미리 고정되어있는 곳에서 보았을 때 사용자 지정 DataTemplate은 종종 아래 XAML과 같은 것을 사용하여 만들어집니다.

<DataTemplate x:Key="someKey"> 
    <TextBlock Text="{Binding Path=FirstName}" /> 
</DataTemplate> 

이 DataTemplate을

또한 나중에 (때문에) findResource ("someKey")를 호출하여 코드 숨김에서 GridViewColumn.CellTemplate에 할당 할 수 있습니다. 그러나이 예제는 Path 요소가 FirstName으로 고정되어 있기 때문에 이것만으로는 전혀 쓸모가 없습니다. 실제로 코드에서 Path를 설정할 수있는 부분이 필요합니다.

XamlReader를 사용하는 경우이 줄을 따라 뭔가가 가능할 수도 있지만 실제로 어떻게 그렇게할지는 모르겠습니다. 모든 솔루션은 크게 감사하겠습니다.

답변

2

두 개의 DataTemplate을 함께 사용하여 필요한 것을 쉽게 빌드 할 수 있습니다. 외부 DataTemplate은 단순히 내부 용 DataContext를 설정합니다 다음과 같이 DataTemplate을 사용합니다.

유일한 까다로운 점은 GridViewColumn에서이 설정을 편리하게하고 있습니다. 코드에서 동등하게

<GridViewColumn 
    my:GVCHelper.DisplayPath="FirstName" 
    my:GVCHelper.Template="{StaticResource DisplayTemplate}" /> 

을 또는 : 나는 당신이 쓸 수 있도록 연결된 속성에이를 것

"DisplayTemplate"라는 DataTemplate을을 야기 이들 중 하나는 FIRSTNAME을 표시하는 데 사용되는
var col = new GridViewColumn(); 
GVCHelper.SetDisplayPath(col, "FirstName"); 
GVCHelper.SetTemplate(col, (DataTemplate)FindResource("DisplayTemplate")); 

그 칼럼에

도우미 클래스

이 구현 될 것 같은 :

작동 원리
public class GVCHelper : DependencyObject 
{ 
    public static string GetDisplayPath(DependencyObject obj) { return (string)obj.GetValue(DisplayPathProperty); } 
    public static void SetDisplayPath(DependencyObject obj, string value) { obj.SetValue(DisplayPathProperty, value); } 
    public static readonly DependencyProperty DisplayPathProperty = DependencyProperty.RegisterAttached("DisplayPath", typeof(string), typeof(GVCHelper), new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => Update(obj) 
    }); 

    public static DataTemplate GetTemplate(DependencyObject obj) { return (DataTemplate)obj.GetValue(TemplateProperty); } 
    public static void SetTemplate(DependencyObject obj, DataTemplate value) { obj.SetValue(TemplateProperty, value); } 
    public static readonly DependencyProperty TemplateProperty = DependencyProperty.RegisterAttached("Template", typeof(DataTemplate), typeof(GVCHelper), new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => Update(obj) 
    }); 

    private static void Update(DependencyObject obj) 
    { 
    var path = GetDisplayPath(obj); 
    var template = GetTemplate(obj); 
    if(path!=null && template!=null) 
    { 
     var factory = new FrameworkElementFactory(typeof(ContentPresenter)); 
     factory.SetBinding(ContentPresenter.ContentProperty, new Binding(path)); 
     factory.SetValue(ContentPresenter.ContentTemplateProperty, template); 
     obj.SetValue(GridViewColumn.CellTemplateProperty, 
     new DataTemplate { VisualTree = factory }; 
    } 
    } 
} 

: 속성이 설정되어 있습니다 때마다, 새로운 DataTemplate을 구축하고 GridViewColumn.CellTemplate 속성이 업데이트됩니다.

0

GridViewColumn.CellTemplateSelector이 도움이 될까요? 또는 사용자 정의 컨트롤을 만들어 충분히 큰 것으로 바인딩 할 수 있습니다 (각 열에 대해 동일합니다). 이 컨트롤을 사용하여 표시 할 내용을 정확히 파악하십시오. DataContext ...

관련 문제