2015-01-16 10 views
0

열을 올바르게 생성하고 DataGrid에서 바인딩 할 수 있도록 ItemsSource가 변경되면 일부 Data에 액세스해야합니다. 이렇게하려면 다른 템플릿을 바인딩하고 선택해야합니다 (불행히도이 상황에서 CellTemplateSelector이 실제로 작동하지 않습니다.)DependencyProperty Setter After After OnItemsSourceChanged

다음 코드에서 TemplateListing에 대한 설정자는 AfterItemsSourceChanged라고합니다. 아무도 왜 또는 어떻게이 문제를 해결할 수 있습니까?

+0

당신은'base.OnItemsSourceChanged (oldValue입니다, NEWVALUE) 전에 변경하려고 않았다' – safi

+0

의 널 (null)을이 경우에 너무 불행하게도 – Asheh

+0

가 null가 아닌되어야하는 이유? AFAIK, 특히 데이터 바인딩을 사용할 때 종속성 속성 할당 순서는 정의되지 않습니다. 두 속성의 변경 내용을 처리해야합니다. –

답변

0

열이로드 될 때까지 초기화가 지연되는 솔루션이 등장했습니다. 그러면 모든 속성을 사용할 수 있습니다.

public class SpreadsheetCellTemplateListing : DependencyObject 
{ 
    public DataTemplate structTemplate { get; set; } 
    public DataTemplate atomicTemplate { get; set; } 
} 

internal class SpreadsheetDataGrid : DataGrid 
{ 
    private bool InitializeColumnsOnLoad = false; 

    public SpreadsheetDataGrid() 
    { 
     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     if (InitializeColumnsOnLoad) 
     { 
      InitializeColumns(); 
     } 
    } 

    public static readonly DependencyProperty TemplateListingProperty = 
     DependencyProperty.Register("TemplateListing", typeof (SpreadsheetCellTemplateListing), 
      typeof (SpreadsheetCellTemplateListing), new PropertyMetadata(null)); 

    public SpreadsheetCellTemplateListing TemplateListing 
    { 
     get { return (SpreadsheetCellTemplateListing) GetValue(TemplateListingProperty); } 
     set { SetValue(TemplateListingProperty, value); } 
    } 

    protected override void OnItemsSourceChanged(System.Collections.IEnumerable oldValue, 
     System.Collections.IEnumerable newValue) 
    { 
     base.OnItemsSourceChanged(oldValue, newValue); 
     if (!IsLoaded) 
     { 
      InitializeColumnsOnLoad = true; 
     } 
     else 
     { 
      InitializeColumns(); 
     } 
    } 
}