2012-03-14 3 views
0

런타임까지 열이 무엇인지 알 수 없기 때문에 코드 뒤에 열을 추가해야하는 DataGrid가 있습니다. ResultsGrid는 DataGrid입니다.데이터가 업데이트되지 않는 데이터 바인딩 문제

ResultsGrid.Columns.Add(new DataGridTextColumn() 
      { 
       Header = columnName, 
       Binding = new Binding("results[" + columnName + "]"), 
       CanUserSort = true, 
       Visibility = buildingFieldList.Single(x => x.FieldName == columnName).Visibility 
      }); 

buildingFieldList에는 사용할 모든 열의 목록이 있습니다. 내 사용자 정의 유형 DBField의 객체를 포함하는 ObservableCollection입니다. 나는 irrelivant 물건을 제거하고 클래스 아래에 붙여 넣은 :

public class DBField : INotifyPropertyChanged 
{ 
private bool _Enabled; 
private Visibility _Visibility; 

public bool Enabled 
{ 
    get { return _Enabled; } 
    set 
    { 
     _Enabled = value; 

     if (_Enabled) 
      _Visibility = System.Windows.Visibility.Visible; 
     else 
      _Visibility = System.Windows.Visibility.Collapsed; 

     OnPropertyChanged("Visibility"); 
     OnPropertyChanged("Enabled"); 
    } 
} 

public Visibility Visibility 
{ 
    get { return _Visibility; } 
    set 
    { 
     _Visibility = value; 

     if (_Visibility == System.Windows.Visibility.Visible) 
      _Enabled = true; 
     else 
      _Enabled = false; 

     OnPropertyChanged("Enabled"); 
     OnPropertyChanged("Visibility"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 


protected void OnPropertyChanged(string name) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(name)); 
    } 
} 
} 

내가 클릭하면 enabled 속성을 수정하고 같은도 _Visibility을 수정하고 OnPropertyChanged를 호출하는 체크 박스가 있습니다. 앞으로 일어날 것으로 예상되는 것은 열의 가시성이 무너 졌기 때문입니다. 그러나 그것은 변화하지 않습니다. 어떤 아이디어?

답변

0

이 문제는 내가 생각했던 것보다 조금 더 신중해야한다. Clemens는 나를 위해 올바른 길을 가고 있었지만 실버 라이트가 DataGridColumn.VisibilityProperty이라는 것을 알지 못했습니다. 나는이 속성이 노출되지 않았기 때문에 다른 사람들이 문제를 가지고있는 것을 발견했다. 이 문제를 해결하기 위해 칼럼에서 확장하여 클래스를 만들었습니다. 나는 다음과 같은 잘했다 :

public class ExtendedDataGridTextColumn : DataGridTextColumn 
{ 
public ExtendedDataGridTextColumn() : base() { } 

public Visibility ColumnVisibility 
{ 
    get { return (Visibility)GetValue(ColumnVisibilityProperty); } 
    set { SetValue(ColumnVisibilityProperty, value); } 
} 

public static readonly DependencyProperty ColumnVisibilityProperty = 
    DependencyProperty.Register(
    "ColumnVisibility", 
    typeof(Visibility), 
    typeof(ExtendedDataGridTextColumn), 
    new PropertyMetadata(ColumnVisibilityChanged)); 

private static void ColumnVisibilityChanged(object sender, DependencyPropertyChangedEventArgs args) 
{ 
    ExtendedDataGridTextColumn column = sender as ExtendedDataGridTextColumn; 
    if (args.NewValue != args.OldValue) 
    { 
     column.Visibility = (Visibility)args.NewValue; 
    } 
} 
} 

가 그럼 난 내 데이터 그리드에 이러한 사용자 지정 열을 추가 :

Binding testBind = new Binding(); 
testBind.Mode = BindingMode.TwoWay; 
testBind.Source = buildingFieldList.Single(x => x.FieldName == columnName); 
testBind.Path = new PropertyPath("Visibility"); 

ExtendedDataGridTextColumn temp = new ExtendedDataGridTextColumn() 
    { 
    Header = columnName, 
    Binding = new Binding("results[" + columnName + "]"), 
    CanUserSort = true 
    }; 

BindingOperations.SetBinding(temp, ExtendedDataGridTextColumn.ColumnVisibilityProperty, testBind); 

ResultsGrid.Columns.Add(temp); 

감사 클레멘스에 따라 나를 도와. 나는 이것이 다른 사람들에게도 도움이되기를 바랍니다.

0

열의 visibility 속성은 바인딩이 아닌 정적 값으로 설정되어 있습니다.

Visibility = buildingFieldList.Single(x => x.FieldName == columnName).Visibility 

Visibility 속성을 개체의 visibility 속성에 바인딩해야합니다. 당신이 DBField.Visibility 변경, 당신은 바인딩을 사용해야 할 때 DataGridTextColumn의 Visibility을 업데이트하려면

+0

설명해 주시겠습니까? 나는 그 일을하려했지만 어떻게 할 수 없었는지 알아 냈다. – Justin

0

:

Binding binding = new Binding("Visibility"); 
binding.Source = buildingFieldList.Single(x => x.FieldName == columnName); 

DataGridTextColumn column = 
    new DataGridTextColumn()  
    {  
     Header = columnName,  
     Binding = new Binding("results[" + columnName + "]"),  
     CanUserSort = true,  
    }; 

BindingOperations.SetBinding(column, DataGridColumn.VisibilityProperty, binding); 

그리고 그것은 아마 좋은 생각이 될 것입니다, 직접 결합하는 대신 완전히 DBField.Visibility를 제거하기 BooleanToVisibilityConverterEnabled 속성 및 사용

Binding binding = new Binding("Enabled"); 
binding.Source = buildingFieldList.Single(x => x.FieldName == columnName); 
binding.Converter = new BooleanToVisibiltyConverter(); 
+0

'DataGridColumn'에는'VisibilityProperty'가 없습니다. – Justin

+0

WPF의 경우 [here] (http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcolumn.visibilityproperty.aspx)를 참조하십시오. 플랫폼이 Silverlight 인 경우 :'DataGridColumn.Visibility'가 Silverlight의 종속성 속성인지 여부는 알 수 없습니다. 'SetBinding'에서'UIElement.VisibilityProperty'를 시도 할 수 있습니다. – Clemens

+0

나는이 문제에 대한 해답을 내가 가진 해결책에 추가했다. 도와 주셔서 감사합니다. – Justin

관련 문제