2012-03-14 16 views
0

実行時まで列が何であるかわからないため、コードの背後に列を追加する必要があるデータグリッドがあります。 ResultsGridはデータグリッドです。データが更新されないデータバインディングの問題

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

この問題は、私が思ったより少しトリッキーでした。クレメンスは私のために正しい道を進んでいたが、シルバーライトには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プロパティにバインドする必要があります。

+0

これを実証できますか?私もそれをやろうとしましたが、どうやって解決するのか分かりませんでした。 – Justin

0

あなたはDataGridTextColumnのVisibilityときDBField.Visibility変更更新するしたい場合は、バインディングを使用しなければならないでしょう:

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

関連する問題