public class YourObjectItem
{
[Browsable(false)]
public Assembly Assembly { get; set; }
代码:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace HQ.Wpf.Util.Behaviors
{
/// <summary>
/// Using this behavior on a dataGRid will ensure to display only columns with "Browsable Attributes"
/// </summary>
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;
}
}
// As proposed by "dba" stackoverflow user on webpage:
// https://stackoverflow.com/questions/4000132/is-there-a-way-to-hide-a-specific-column-in-a-datagrid-when-autogeneratecolumns
// I added few next lines:
var displayName = att as DisplayNameAttribute;
if (displayName != null)
{
e.Column.Header = displayName.DisplayName;
}
}
}
}
}
}
namespace dev
{
/// <summary>
/// View model for tag list view in data grid
/// </summary>
public class TagDataViewModel : BaseViewModel
{
/// <summary>
/// Default constructor
/// </summary>
/// <param name="path">The JSONPath to this item</param>
public TagDataViewModel(string path)
{
FullPath = path;
}
/// <summary>
/// Gets and sets the JSONPath to this item
/// </summary>
private string FullPath { get; set; }
/// <summary>
/// Gets the name
/// </summary>
public string Name => ProjectHelpers.GetPropertyValue(FullPath, "Name");
/// <summary>
/// Gets the address
/// </summary>
public string Address => ProjectHelpers.GetPropertyValue(FullPath, "Address");
/// <summary>
/// Gets the data type
/// </summary>
public string DataType => ProjectHelpers.GetPropertyValue(FullPath, "DataType");
/// <summary>
/// Gets the scan rate
/// </summary>
public string ScanRate => ProjectHelpers.GetPropertyValue(FullPath, "ScanRate");
/// <summary>
/// Gets the scaling type
/// </summary>
public string ScalingType => ProjectHelpers.GetPropertyValue(FullPath, "ScalingType");
}
}
8条答案
按热度按时间uqcuzwp81#
在你的数据网格中,订阅
AutoGeneratingColumn
事件,事件args
(DataGridAutoGeneratingColumnEventArgs
)有列名和一个“Cancel
“,如果列名是ID则设置Cancel = true
。应该可以pepwfjgg2#
你可以使用一个行为(可重用代码)来完成这项工作……这样你就可以使用attribute来将列的可见性集中在一个地方。
使用方法:
...
代码:
kuhbmx9i3#
另一种可能性是
Visibility.Collapsed
:eit6fx6z4#
我不认为这是个好办法...但是.你可以多一个抽象层,比如说你有一个像这样的对象:
您不希望ID为column,因此创建了新对象
然后将FooMap/转换为Foo 2,就完成了。
另一种可能的方法 (并不总是可能的) 是将访问修饰符更改为internal
这样你也不会生成Id列。
wqlqzqxt5#
我使用
Browsable
属性和Visibility: Collapsed
实现了这一点模型
自定义控件扩展:
ViewModel
XAML
blmhpbnm6#
我不能说4,但这是不可能的,在3.5 SP1,至少没有登记的事件,我想不惜一切代价避免。
您可以将生成代码更改为
AutoGenerateColumns=False
,然后将您关心的列放在XAML中,因为基础数据仍然会适当地放在列中这将允许您显示与基础模型相关的唯一列,并将
Header
更改为您认为合适的显示,这样您就不会被模型上的Property
名称所束缚。oiopk7p57#
我最近做了这个,想分享我的解决方案:
我只是创建了一个视图模型,希望datagrid遵循这个模型,并且对于我希望它忽略的字段(也就是说,不自动生成列),只需将这些字段设置为private。工作起来很有魅力,不需要不必要的代码。
例如,下面是我传递给包含数据网格的视图的视图模型。只需将不希望作为列的字段设置为private,就可以获得所需的所有内容,如示例中的“FullPath”字段所示。我明白这可能不是在每种情况下都可能,但对我来说效果相当好。
qybjjes18#
并在代码端粘贴它并替换您的模型值以跳过: