我有一个数据网格,我必须在后面的代码中添加列,因为在运行之前我不知道这些列是什么。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。我已经去掉了不相关的东西,并粘贴了下面的类:
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。我希望发生的情况是,该列现在的可见性已折叠。然而,它并没有改变。你知道为什么吗?
发布于 2012-03-15 20:21:30
这个问题比我想象的要棘手一些。克莱门斯为我走上了正确的道路,但我没有看到银光军团有一个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);感谢克莱门斯对我的帮助。我希望这也能帮助其他人。
发布于 2012-03-15 04:54:11
将列上的visibility属性设置为静态值,而不是绑定。
Visibility = buildingFieldList.Single(x => x.FieldName == columnName).Visibility您需要将可见性属性绑定到对象上的可见性属性。
发布于 2012-03-15 04:55:07
如果希望在DBField.Visibility更改时更新DataGridTextColumn的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并直接绑定到Enabled属性并使用BooleanToVisibilityConverter可能是个好主意
Binding binding = new Binding("Enabled");
binding.Source = buildingFieldList.Single(x => x.FieldName == columnName);
binding.Converter = new BooleanToVisibiltyConverter();https://stackoverflow.com/questions/9709421
复制相似问题