2011-07-21 9 views
0

私たち自身のビジネスベースのコンテキストメニューで動的列生成をサポートするために、WPF DataGridに基づいてWPF UserControlを開発しています。WPF DataGrid ItemSource Refresh - GridColumnsが奇妙な動作を示す

カスタムメソッドを呼び出すDataSourceを設定して、DataSourceをバインドして、オンザフライで列を作成し、ItemSourceプロパティを設定すると、DataSourceというDependency Propertyが作成されました。最初はすべて正常に動作します。私はリフレッシュと呼ばれるコンテキストメニューを持っていますが、ユーザーがRefreshをクリックするとSQLが実行され、前述のアクションの同じ項目が発生します。 2回目は、行と列が完全に作成されます。しかし、私は横のスクロールを行うときに、列のヘッダーが正しく表示されていない、その視界の状態をスクロールしながら失われます。

マイカスタムプロパティ - データソース

public static DependencyProperty DataSourceProperty = 
     DependencyProperty.Register("DataSource", typeof(GridDataModel), typeof(MyGridView), 
     new PropertyMetadata((dependencyObject, eventArgs) => 
     { 
      if (eventArgs.OldValue != null) 
      { 
       ((GridDataModel)eventArgs.OldValue).Dispose(); 
      } 
      BindToDataSource((MyGridView)dependencyObject, (GridDataModel)eventArgs.NewValue);    
     })); 

私はDataSourceプロパティを設定するたびに呼び出している私のカスタム方法:

private static void BindToDataSource(MyGridView view, GridDataModel dataModel) 
    { 
     if (view.ViewModel != null) 
     {    
      BindingOperations.ClearAllBindings(view.GridView); 
      view.GridView.Items.Clear();     
      view.GridView.Columns.Clear();     
      view.GridView.ItemsSource = null;     
      view.ViewModel.Dispose();     
     } 
     view.ViewModel = new MyGridViewModel(dataModel); 
     view.ViewModel.PrepareGridView(); 
     view.LayoutRoot.DataContext = view.ViewModel; 
     view.CreateColumns();       
     view.GridView.SetBinding(DataGrid.ItemsSourceProperty, new Binding("DisplayRows")); 
    } 

私は最新の情報に更新]メニューを呼び出すために使用される以下のコードクリック:

private void OnRefreshClick(object sender, RoutedEventArgs e) 
    { 
     var data = new TestDataAccess(); 
     DataSource = data.MakeGridModel("select Top 200 * from ApplicationUSer"); //Assigning DataSource Again, which will call the above method. 
     GridView.UpdateLayout(); 
    } 

添付画像がこの問題を理解するのに役立つことがあります。リフレッシュ後に、水平スクロールの際に列の配置が奇妙になることがあります。この奇妙な問題を解決するための助けが必要です。

はGridColumnWidth = 0を使用してみました、そしてオートに再び設定し、 、)(GridView.UpdateLayoutを試してみました![ここに画像の説明を入力] [1]

答えて

1

私は上記の問題に私の自己を解決しました。私はデータをバインドするたびにためItems.Clear()によるメモリを取り戻すことができるようにだけItemSourceを一掃 - 代わりBindingOperations.ClearAllBindings()私はBindingOperations.ClearBinding(view.GridView、DataGrid.ItemSourceProperty)を使用する

ClearAllBindingsのため、ヘッダーパネルのバインディングもクリアされるため、水平スクロール中にその奇妙な問題が発生するため、ParentTemplate.Widthプロパティが失われます。