2011-12-26 3 views
2

Я использовал эту ссылку http://thibaud60.blogspot.com/2010/02/footer-on-wpf-datagrid-by-use-several.html для синхронизации двух DataGrid, но заголовок столбца перетаскивания иногда имеет ошибку.WPF: DataGrid sync B DataGrid With columnWith и DisplayIndex

сетке данных имеет три колонки: A1, A2, A3

В DataGrid имеет три столбца: B1, B2, B3

Я SetBinding вроде:

Binding bindingWidth = new Binding(); 
bindingWidth.Mode = BindingMode.TwoWay; 
bindingWidth.Source = A1; 
bindingWidth.Path = new PropertyPath(DataGridColumn.WidthProperty); 
BindingOperations.SetBinding(B1, DataGridColumn.WidthProperty, bindingWidth); 

Binding bindingDisplayIndex = new Binding(); 
bindingDisplayIndex.Mode = BindingMode.TwoWay; 
bindingDisplayIndex.Source = A1; 
bindingDisplayIndex.Path = new PropertyPath(DataGridColumn.DisplayIndexProperty); 
BindingOperations.SetBinding(B1, DataGridColumn.DisplayIndexProperty, bindingDisplayIndex); 

, как правило, эта работа хорошо,

но я изменил A1 displayindex, перетащив столбец когда-то двухсторонняя привязка не работает:

i перетащить A3 В положение A1 не удастся, но B3 удастся изменить положение на B1

A1.DisplayIndex! = B1.DisplayIndex?

Почему это происходит?

ответ

0

я использовал

private static Dictionary<DataGridColumn, DataGridColumn> ColumnCache=new Dictionary<DataGridColumn,DataGridColumn>(); 

для хранения в DataGridColumn и

 dgSource.ColumnDisplayIndexChanged += (sender1, e1) => 
       { 
        var a=ColumnCache[e1.Column]; 
        a.DisplayIndex = e1.Column.DisplayIndex; 
       }; 

изменить columnDisplayIndex и ошибка, когда я использовал связывание как:

Binding bindingDisplayIndex = new Binding(); 
bindingDisplayIndex.Mode = BindingMode.TwoWay; 
bindingDisplayIndex.Source = A1; 
bindingDisplayIndex.Path = new PropertyPath(DataGridColumn.DisplayIndexProperty); 
BindingOperations.SetBinding(B1, DataGridColumn.DisplayIndexProperty, bindingDisplayIndex); 

имеет разрешения. может быть, есть некоторые авто ручки до изменения columnDisplay

0

Я взял несколько раз, чтобы найти хороший подход, так и для тех, кто не хочет искать :-) Спасибо за вашу помощь

private static Dictionary<DataGridColumn, DataGridColumn> ColumnCache = new Dictionary<DataGridColumn, DataGridColumn>(); 
private static void SynchronizeVerticalDataGrid(DataGrid source, DataGrid associated) 
{ 
    associated.HeadersVisibility = source.HeadersVisibility & (DataGridHeadersVisibility.Row); 
    associated.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; 

    int sourceColIndex = 0; 
    for (int associatedColIndex = 0; associatedColIndex < associated.Columns.Count; associatedColIndex++) 
    { 
     var colAssociated = associated.Columns[associatedColIndex]; 
     var colSource = source.Columns[sourceColIndex]; 
     sourceColIndex++; 

     ColumnCache.Add(colSource, colAssociated); 

     Binding binding = new Binding(); 
     binding.Mode = BindingMode.TwoWay; 
     binding.Source = colSource; 
     binding.Path = new PropertyPath(DataGridColumn.WidthProperty); 
     BindingOperations.SetBinding(colAssociated, DataGridColumn.WidthProperty, binding); 
    } 

    source.ColumnDisplayIndexChanged += (sender1, e1) => 
     { 
      var a = ColumnCache[e1.Column]; 
      a.DisplayIndex = e1.Column.DisplayIndex; 
     }; 
}