我有一个使用AutoGenerateColumns = True绑定到DataTable的WPF 4.0 DataGrid。这些列是动态的,但是我知道总会有一个名为ID的列,我想隐藏这个列。有什么办法可以做到这一点?有没有办法在AutoGenerateColumns = True时隐藏DataGrid中的特定列?
回答
,认购AutoGeneratingColumn
事件,事件args
(DataGridAutoGeneratingColumnEventArgs
)的列名和“Cancel
”,如果列名是ID然后设置Cancel = true
。应该做的伎俩。
我不能说4,但是在3.5 SP1中是不可能的,至少没有注册我想要不惜一切代价避免的事件。
你可以做什么,而不是是改变你的代码AutoGenerateColumns=False
然后只需将你所关心的XAML中的基础数据都将仍然被放置在列中的列适当
<dg:DataGridTextColumn Header="Display" Binding="{Binding DisplayName}"/>
<dg:DataGridTextColumn Header="Host" Binding="{Binding HostName}"/>
<dg:DataGridTextColumn Header="Database" Binding="{Binding Database}"/>
<dg:DataGridTextColumn Header="Username" Binding="{Binding Username}"/>
<dg:DataGridTextColumn Header="Password" Binding="{Binding Password}"/>
这将使您可以显示您关心的底层模型的唯一列,并根据需要将Header
更改为显示,因此您不会绑定到模型上的Property
名称。
我不会说这是很好的解决方案...但是...你可以有例如多了一个抽象层 假设你有一个像对象:
public class Foo
{
public string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
你不希望列为Id,所以你创建新的对象
public class Foo2
{
public string Property2 { get; set; }
public string Property3 { set; get; }
}
然后映射/转换Foo到Foo2,你就完成了。
(并不总是可能),另一种可能的方式是访问修饰符更改为内部
public class Foo
{
internal string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
这样你就不必生成的ID列要么。
另一种可能性是Visibility.Collapsed
:
private void dataGrid_AutoGeneratingColumn(object sender,
DataGridAutoGeneratingColumnEventArgs e)
{
//Set properties on the columns during auto-generation
switch (e.Column.Header.ToString())
{
case "rownameYouWantToHide":
e.Column.Visibility = Visibility.Collapsed;
break;
}
}
您可以使用行为(可重用的代码),做的工作......这样你就可以使用属性,它会集中在一个地方的知名度列。
用法:
<Window
...
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">
<DataGrid ...
extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">
...
public class YourObjectItem
{
[Browsable(false)]
public Assembly Assembly { get; set; }
代码:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace WpfControlLibrary.Extension
{
public static class DataGridBehavior
{
public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty =
DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn",
typeof(bool),
typeof(DataGridBehavior),
new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged));
public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj)
{
return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty);
}
public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val)
{
obj.SetValue(UseBrowsableAttributeOnColumnProperty, val);
}
private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var dataGrid = obj as DataGrid;
if (dataGrid != null)
{
if ((bool) e.NewValue)
{
dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn;
}
else
{
dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn;
}
}
}
private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var propDesc = e.PropertyDescriptor as PropertyDescriptor;
if (propDesc != null)
{
foreach(Attribute att in propDesc.Attributes)
{
var browsableAttribute = att as BrowsableAttribute;
if (browsableAttribute != null)
{
if (! browsableAttribute.Browsable)
{
e.Cancel = true;
}
}
}
}
}
}
}
这正是我正在寻找的!经测试并在.NET 4.6.1上工作:) – JoanComasFdz 2016-11-23 14:02:17
谢谢!很高兴知道它仍然工作正常:)! – 2016-11-23 16:52:32
DataGrid应该以这种方式开箱即用,并从DisplayNameAttriibute中挑选标题! – StuartQ 2017-12-12 17:39:03
- 1. 如何在AutoGenerateColumns =“true”时隐藏列GridView?
- 2. 有没有办法隐藏主要活动的特定列表视图项目?
- 3. 有没有办法在Keystone.js中隐藏ID列?
- 4. 有没有办法隐藏'System.Windows.Forms.ListBox()'边框?
- 5. 有没有办法隐藏JavaScript代码?
- 6. 有没有办法在传递数据框时隐藏rhandsontable中的列
- 7. 有没有办法在AppCode中隐藏cocoapods中的警告?
- 8. 有没有办法隐藏/自定义ChartJS上面的图例?
- 9. 有没有办法让NetBeans隐藏特定的文件/文件夹?
- 10. 有没有办法显示/隐藏没有CSS的元素?
- 11. mvc3 .net - 有没有办法在视图中完全隐藏隐藏字段?
- 12. 有没有办法在UIScrollView中隐藏滚动指标?
- 13. 有没有什么办法在IntelliJ 9中隐藏面板?
- 14. 有没有办法在IFRAME src页面中隐藏元素?
- 15. 有没有办法在Ace Editor中隐藏垂直标尺?
- 16. 在Xul或JavaScript中,有没有办法隐藏鼠标光标?
- 17. 有没有办法在Netbeans或Eclipse中隐藏注释?
- 18. 有没有办法暂时隐藏或禁用单向通知?
- 19. 有没有办法检测HTML元素何时被隐藏?
- 20. 当没有足够的空间时,有没有办法隐藏视图
- 21. 有没有办法隐藏VS2010 MEF扩展中的代码?
- 22. 有没有办法在比较分支时“隐藏”GitHub中的合并提交?
- 23. 有没有办法只索引MySQL中的特定列值?
- 24. 有没有办法在特定的时间显示表格
- 25. 有没有办法在Swift上隐藏UIDatePicker?
- 26. 有没有办法隐藏在谷歌Analytics(分析)
- 27. 有没有办法找到在特定时间更新特定字段的SQL?
- 28. ASP.NET Datagrid - 隐藏一个特定的行/列
- 29. 有没有办法隐藏PHP的警告不访问php.ini?
- 30. 有没有办法禁用ActionBar的显示/隐藏动画?
这会工作...尽管它立即违背了MVVM模式......但毫无疑问会起作用。 – 2010-10-22 19:29:46
谢谢,这将很好地工作。在这种情况下,我并不太关心MVVM,因为DataGrid是自定义UserControl的一部分,并且如果仅影响View,那么使用后台代码就没有问题。 – Rachel 2010-10-22 19:33:59
@Aaron,如果你依赖视图来生成MV,那么我认为你会发现它不符合MVVM :) – 2010-10-22 19:34:53