2016-12-19 4 views
0

나는 이상한 버그가있어서 구조가 필요합니다. WPF에서 여러 유형의 여러 열이있는 표가 있습니다.WPF에서 세로 스크롤 막대로 재생할 때 날짜 피커 열이 활성화됩니다.

private IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid) 
{ 
    //return the Datagrid Rows 
} 

public void SetChangeLockState(bool isUnlocked) 
{ 
    IEnumerable<DataGridRow> _rows = this.GetDataGridRows(this._mainDatagrid); 
    foreach (DataGridColumn _column in this._mainDatagrid.Columns) 
    { 
     if (_column.GetType() != typeof(DataGridTemplateColumn)) continue; 
     foreach (DataGridRow _row in _rows) 
     { 
      FrameworkElement frameworkElement = _column.GetCellContent(_row); 
      if (frameworkElement != null) frameworkElement.IsEnabled = !isUnlocked; 
     } 
    } 
} 
: 내 변수 중 하나의 특정 상태에 내 그리드의 DatePickers을 해제하는 방법을 뒀다

FrameworkElementFactory dateFactory = new FrameworkElementFactory(typeof(DatePicker)); 
... 
column = new DataGridTemplateColumn { CellTemplate = new DataTemplate 
{ VisualTree = dateFactory } }; 
this._mainDatagrid.Columns.Add(column); 

: 하나 이러한 열 몇 내가 FrameElementFactory를 통해 생성 DatePickers 있습니다

문제는 내가 그리드의 엘리베이터로 놀고있을 때, Datepicker가 아무 이유없이 계속 켜고 끌 수 있다는 것입니다. 예 : 내 모든 DatePicker가 활성화되어 있습니다. 세로 스크롤 막대를 가지고 놀고 있어도 문제 없습니다.

내 모든 DatePickers는 사용할 수 없으며 세로 스크롤 막대를 가지고 놀고 있습니다. 1 DatePicker에서 갑자기 수 있도록 나타납니다 : 나는 스크롤을 가지고 노는 유지하고 DatePicker enabled 1

을 다른 날짜 선택기가 활성화 갈 것입니다 : DatePicker enabled 2

당신에게 일어날 수있는 것의 어떤 생각이 있나요?

도움 주셔서 감사합니다.

답변

0

DataGrid.EnableRowVirtualization의 기본값은 true입니다. 이렇게하면 UI 가상화가 가능해집니다. 즉, 뷰 밖으로 스크롤 된 UI 요소를 삭제하거나 다시 사용할 수 있습니다. 따라서 항목을 다시보기로 스크롤 할 때 공장을 통해 새 DatePicker가 생성되고 SetChangeLockState이 호출 될 때이 새로운 DatePicker가 존재하지 않으므로 비활성화되지 않습니다.

빠른 수정은 DataGrid.EnableRowVirtualization을 false로 설정하는 것이지만, 많은 행이있는 경우에는별로 좋지 않을 수 있습니다. 더 나은 해결책은 IsEnabled 속성을 설정하는 대신 바인딩하는 것입니다 (예 : RelativeSource를 사용하여 Window의 속성에 추가합니다.

+0

좋은 해답이 될 것 같다, 내가 밖으로 시도하고 최대한 빨리 대답에 그것을 설정합니다. 고마워. – goatman

0

감사 벤, 여기에 코드입니다 :

dateFactory.SetBinding(
        //My IsEnabled property I wanted to change 
        IsEnabledProperty, 
        new Binding("IsLockedDatagrid") 
        { 
         //Datagridwidget is the datagrid I am using where I can found the IsLockedDatagrid boolean variable (in my xaml) 
         RelativeSource = 
          new RelativeSource(RelativeSourceMode.FindAncestor, typeof(DataGridWidget), 1), 
         Mode = BindingMode.OneWay, 
         UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
        }); 
관련 문제