2014-07-05 10 views
0

코드에 DatePicker DataGrid 열을 설정하려고합니다. 이 열은 각각 다른 유형의 객체를 표시하는 다양한 DataGrid와 함께 사용됩니다. FrameworkElementFactory이기 때문에 a deprecated way to programmatically create templates 후 나는 또 다른 접근 방식에 대한 더 나은 검색 알았는데, 그러나DataTemplate을 DataGridColumn에 바인딩 CellTemplate

public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName) 
{ 
    DataGridTemplateColumn dgCol = new DataGridTemplateColumn(); 
    dgCol.Header = header; 
    dgCol.IsReadOnly = isReadOnly; 

    FrameworkElementFactory dateFactory = new FrameworkElementFactory(typeof(DatePicker)); 
    dateFactory.SetBinding(DatePicker.SelectedDateProperty, new Binding(fieldName)); 
    dateFactory.SetValue(DatePicker.IsEnabledProperty, !isReadOnly); 

    DataTemplate cellTemplate = new DataTemplate(); 
    cellTemplate.VisualTree = dateFactory; 

    dgCol.CellTemplate = cellTemplate; 

    return dgCol; 
} 

: this post에서 나는 작품을 좋아 다음 코드를 함께했다.

대안으로 저는 DataTemplates를 리소스로 만든 다음 코드에 적용하는 방법에 대해 생각했습니다. 이것은 내가 지금까지 가지고있는 곳이지만 바인딩을 설정하는 방법을 모르겠습니다. 여기 내 DatePicker에서 템플릿입니다 :

<DataTemplate x:Key="DatePickerColumnCellTemplate"> 
    <DatePicker SelectedDate="{Binding Path=StartDate}" /> 
</DataTemplate> 

그리고 여기에 새로운 GetDataGridColumn 방법 :

public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName) 
{ 
    DataGridTemplateColumn dgCol = new DataGridTemplateColumn(); 
    dgCol.Header = header; 
    dgCol.IsReadOnly = isReadOnly; 

    dgCol.CellTemplate = (DataTemplate)Application.Current.FindResource("DatePickerColumnCellTemplate"); 

    return dgCol; 
} 

이 새로운 접근 방식은 DatePicker에서 열의 지금은 UI 디자인에 정의되어 있기 때문에 더 우아한 해결책이 될 것 같다 XAML 코드 만 사용하여 에 적용했습니다. 그러나 이제 내 DatePicker 열에는 시작 날짜 만 표시됩니다. 메서드의 인수 fieldName은 "StartDate"또는 "EndDate"또는 데이터 격자에 표시되는 개체에 정의 된 다른 DateTime 변수가 될 수 있습니다. 또한 DatePicker IsEnabled 속성을 isReadOnly 값으로 설정하는 방법을 잘 모르겠습니다.

이것이 최선의 방법이 아니라고 생각되면 알려 주시기 바랍니다.

감사합니다.

답변

1

답변이 없기 때문에 여기에 나와있는 해결책이 있습니다.

XAML에서 만든 템플릿의 바인딩을 연결하는 방법을 찾지 못했지만 대신 DatePicker DataGridColumn을 만들려고합니다. 그래서 데이터 그리드 컬럼에 대한 추상 기본 클래스에서 상속하여 내 자신의 DatePickerDataGridColumn 클래스를 생성 :

public class DatePickerDataGridColumn : DataGridColumn 
{ 
    public DatePickerDataGridColumn() : base() { } 

    public BindingBase SelectedDateBinding { get { return _selectedDateBinding; } set { _selectedDateBinding = value; } } 
    private BindingBase _selectedDateBinding = null; 

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) { return null; } 

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     DatePicker picker = new DatePicker(); 
     picker.IsEnabled = !IsReadOnly; 
     picker.BorderThickness = new Thickness(0.0); 

     if (SelectedDateBinding != null) 
     { 
      picker.SetBinding(DatePicker.SelectedDateProperty, SelectedDateBinding); 
     } 

     return picker; 
    } 
} 

그런 다음 내 GetDataGridColumn 방법이되었다 :

public override DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName) 
{ 
    DatePickerDataGridColumn dgCol = new DatePickerDataGridColumn(); 
    dgCol.Header = header; 
    dgCol.IsReadOnly = isReadOnly; 

    Binding b = new Binding(fieldName); 
    if (isReadOnly) { b.Mode = BindingMode.OneWay; } 
    dgCol.SelectedDateBinding = b; 

    return dgCol; 
}