2011-06-23 8 views
-1

私はDataGridを持っています。列の1つは、その中にCheckBoxがあるテンプレートです。 CheckedまたはUncheckedイベントがトリガされると(両方とも発生します)、CheckBoxのDataContextがnullになることがあり、これによってコードがエラーになります。あなたがボタンを素早く押して離している間にマウスが動いていると、それは最も頻繁にヌルに見えます(断続的です)。Silverlight DataGridでは、Checked/UncheckedのときにCheckBoxのDataContextがnullになることがあります。

私が望むことによって、チェックボックスのDataContextのへの変更のために耳を傾け:ListenCheckBox(チェックボックスを拡張する)と結合を取り付け、それが nullにを設定することはありませんが、それは私がwouldnの回でヌルからタスクに設定されていますつまり、DataGridが完全に生成され、ボックスのチェック/チェックを外した後です。チェックされていないイベントがnullのDataContextで実行された直後に、DataContextがnullからTaskに変更されたことを示す通知が表示されるため、null DataContextを取得したときに、DataContextそれがChecked/Uncheckedイベントを実行する頃に。

また、デバッグのためにCheckBoxにTag = "{Binding}"を追加しました。このタグは、DataContextよりも頻繁にヌルではない(すなわち、適切なオブジェクトを有する)が、すべてではない。ここで

XAMLコードの関連するビットです:

<navigation:Page.Resources> 
    <sdk:DataGridTemplateColumn x:Key="DeleteOrPrintSelect" Header="Delete Or Print Notes Selection"> 
     <sdk:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <views:ListenCheckBox IsChecked="{Binding DeleteOrPrintNotesSelection, Mode=TwoWay}" Checked="DeletePrintNotesCheckBox_Changed" Unchecked="DeletePrintNotesCheckBox_Changed" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding}" /> 
      </DataTemplate> 
     </sdk:DataGridTemplateColumn.CellTemplate> 
    </sdk:DataGridTemplateColumn> 
</navigation:Page.Resources> 


    <sdk:DataGrid x:Name="dataGrid1" Grid.Column="1" Grid.Row="2" AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn"> 
     <sdk:DataGrid.RowGroupHeaderStyles> 
      [removed] 
     </sdk:DataGrid.RowGroupHeaderStyles> 
    </sdk:DataGrid> 

そして背後に関連するコード:

 // Create a collection to store task data. 
     ObservableCollection<Task> taskList = new ObservableCollection<Task>(); 
     [code adding Tasks to taskList removed] 

     PagedCollectionView panelListView = new PagedCollectionView(taskList); 
     this.dataGrid1.ItemsSource = panelListView; 
    } 

    private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     if (e.PropertyName == "DeleteOrPrintNotesSelection") 
     { 
      e.Column = Resources["DeleteOrPrintSelect"] as DataGridTemplateColumn; 
     } 
     else 
     { 
      e.Column.IsReadOnly = true; 
     } 
    } 

    private void DeletePrintNotesCheckBox_Changed(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      var cb = sender as CheckBox; 
      var t = cb.DataContext as Task; 
      t.DeleteOrPrintNotesSelection = cb.IsChecked == true; 
      PagedCollectionView pcv = this.dataGrid1.ItemsSource as PagedCollectionView; 
      ObservableCollection<Task> taskList = pcv.SourceCollection as ObservableCollection<Task>; 
      bool anySelected = taskList.Any(x => x.DeleteOrPrintNotesSelection); 
      this.btnPrint.IsEnabled = anySelected; 
      this.btnDelete.IsEnabled = anySelected; 
     } 
     catch (Exception ex) 
     { 
      ErrorMessageBox.Show("recheck", ex, this); 
     } 
    } 

は、任意のアイデア?前もって感謝します。

+0

@Downvotersは説明しやすいですか? –

答えて

2

この問題は、セルをダブルクリックしてセル編集テンプレートに移動したときに問題が発生していました。私の場合、セル編集テンプレートは定義されていないので、同じセルテンプレートを使用しましたが、何も変更しない代わりに、新しいチェックボックスを作成することにしました。 私は、列のIsReadOnlyプロパティをtrueに設定し、それを修正しました。代替ソリューション:この1つは、私はデフォルトのDataContextは、{}バインドされたと思っているので、それを修正する理由

DataContext="{Binding}" (in XAML, or the code equivalent:) 
cb.SetBinding(FrameworkElement.DataContextProperty, new Binding()); 

は私はわかりません。おそらくSilverlightのバグです。デフォルトのままにするのではなく、明示的に定義すると、別の順序で設定されます。

+0

私は同じ問題に遭遇しました。それは、DataGridではなくカスタムのテンプレートコントロールでしか発生しませんでした。私はDataContextをデータバインディングで解決しました。 – Gabe

関連する問題