2016-12-19 11 views
0

私は変なバグがあり、いくつかのレスキューが必要です。 私はWPFで複数の型の複数の列を持つグリッドを持っています。WPFの垂直スクロールバーで再生するときに有効になるDatepicker列

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 enabled 1

をし、別の日付ピッカーが有効になります:DatePicker enabled 2

はあなたに起こることができるものの任意のアイデアをお持ちですか?

ありがとうございました。

答えて

0

これは、DataGrid.EnableRowVirtualizationがデフォルトでtrueになるためです。これにより、UIの仮想化が可能になります。つまり、表示外にスクロールされたUI要素が配置または再利用される可能性があります。このため、項目をスクロールして新しいDatePickerが工場で作成され、SetChangeLockStateが呼び出されたときにこの新しいDatePickerが存在しないため、無効にはなりません。

すぐに修正するには、DataGrid.EnableRowVirtualizationをfalseに設定しますが、多くの行がある場合は、これはあまり効果的ではありません。より良い解決策は、IsEnabledプロパティを設定するのではなく、バインドすることです。 RelativeSourceを使用してウィンドウ上のプロパティに移動します。

+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 
        }); 
関連する問題