- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在仔细研究 Laurent 的优秀工具包,我有以下问题。
从 Blend 4 开始,我为 Loaded 事件添加了一个 EventTrigger,在我的 ViewModel 中我有以下内容:
public RelayCommand rcAutoGeneratingColumn { get; private set; }
在构造函数中我有:
rcAutoGeneratingColumn =
new RelayCommand(o => DataGridAutoGeneratingColumn(o));
还在 ViewModel 中,我有希望由 RelayCommand 调用的方法:
private void DataGridAutoGeneratingColumn(Object o)
{
DataGrid grid = (DataGrid)o;
foreach (DataGridTextColumn col in grid.Columns)
{
if (col.Header.ToString().ToLower() == "id")
{
col.Visibility = System.Windows.Visibility.Hidden;
}
}
}
我的 XAML 包含以下内容(针对 DataGrid):
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<GalaSoft_MvvmLight_Command:EventToCommand
Command="{Binding rcAutoGeneratingColumn, Mode=OneWay}"
CommandParameter="{Binding ElementName=dataGrid1, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
这里没有问题代码工作得很好,但显然用于隐藏某些列的事件应该是AutoGenerateColumn事件而不是Loaded。我曾经使用 Loaded 事件作为解决方法。
我希望我可以中继控件提供的任何事件,以便在这种情况下,以下内容可以代替:
<i:Interaction.Triggers>
<i:EventTrigger EventName="AutoGeneratingColumn">
<GalaSoft_MvvmLight_Command:EventToCommand
Command="{Binding rcAutoGeneratingColumn, Mode=OneWay}"
CommandParameter="{Binding ElementName=dataGrid1, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
我无法触发 AutoGenerateColumn 事件,我希望我忽略了一些事情,并且感谢您提供的任何建议!
此行为与 DevExpress 中的 GridControl 相同,即会触发 Loaded 事件,而不会触发 ColumnsPopulated 事件(这相当于 AutoGenerateColumn 事件)。
DevExpress 针对我的问题提供了以下信息:
“我们已经审查了这个问题,并得出了一个有趣的结论。看起来在处理 Interaction.Triggers 时并未构建可视化树”
如果这是真的,并且没有其他方法可以调用 ViewModel 中的事件,那么就必须继续 - 通过使用试验和错误 - 记下哪些 DataGrid 事件(其中有超过 100) 可以通过这种方式调用,而其中不能!
人们可能会认为,在应用 MVVM 模式时,也可以访问代码隐藏中可用的每个事件。
我已经寻找答案,但我不能排除我忽略了一些东西,所以如果是这种情况,请接受我的道歉!
最佳答案
您不必在后面使用邪恶的代码;-)您可以使用附加行为来做到这一点...
public class AutoGeneratingColumnEventToCommandBehaviour
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached(
"Command",
typeof(ICommand),
typeof(AutoGeneratingColumnEventToCommandBehaviour),
new PropertyMetadata(
null,
CommandPropertyChanged));
public static void SetCommand(DependencyObject o, ICommand value)
{
o.SetValue(CommandProperty, value);
}
public static ICommand GetCommand(DependencyObject o)
{
return o.GetValue(CommandProperty) as ICommand;
}
private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var dataGrid = d as DataGrid;
if (dataGrid != null)
{
if (e.OldValue != null)
{
dataGrid.AutoGeneratingColumn -= OnAutoGeneratingColumn;
}
if (e.NewValue != null)
{
dataGrid.AutoGeneratingColumn += OnAutoGeneratingColumn;
}
}
}
private static void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var dependencyObject = sender as DependencyObject;
if (dependencyObject != null)
{
var command = dependencyObject.GetValue(CommandProperty) as ICommand;
if (command != null && command.CanExecute(e))
{
command.Execute(e);
}
}
}
}
然后像这样在 XAML 中使用它...
<DataGrid ItemsSource="{Binding MyGridSource}"
AttachedCommand:AutoGeneratingColumnEventToCommandBehaviour.Command="{Binding CreateColumnsCommand}">
</DataGrid>
关于wpf - MVVM - WPF DataGrid - AutoGenerateColumn 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881904/
关于VB.NET中GridView排序的问题: 我有一个带有 AutoGenerateColumns = True 的 GridView 我已经声明了排序事件
我是 MVVM 新手。我在我的项目中使用 wpf 和 MVVM。所以我现在正在测试一些东西,然后再深入研究我需要编写的应用程序。 我的页面(EmpDetailsWindow.xaml)是这样的
我有一个在 winforms 中使用 AutoGenerateColumns 的数据 GridView 。有一个日期列,然后是包含数值的 1-16 个数据列。我希望将所有这些 1-16 数据列格式化为
我有一个很大的 ObservableCollection,其中包含 40 多个不同类型的列。一些列是列表。我不想设置 AutoGenerateColumns=false 因为列的 amont 但数据网
我正在使用 AutoGenerateColumns="True"的 DataGrid。现在,除了自动生成的列之外,我还想添加一个我的“自定义”列,即所谓的“服务”列。 (在其中我想有几个超链接“开始”
我的 GridView : 在后面的代码中: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e
我目前正在仔细研究 Laurent 的优秀工具包,我有以下问题。 从 Blend 4 开始,我为 Loaded 事件添加了一个 EventTrigger,在我的 ViewModel 中我有以下内容:
我刚刚制定了一个将属性 (DP) 绑定(bind)到 Datagrid 的解决方案。没关系,一切都光滑柔软。但是当我运行该应用程序时,DataGrid 只显示空白行!(假设有 10 条记录,我看到 1
我有一个配置为根据我的类(使用数据绑定(bind))自动生成列的 datagridview。 它适用于我所有类型为 string 的属性。但是,我有一个枚举类型的属性,使用类型转换器将其转换为图像。
我使用的是 GridView ,我需要每当任何列包含的文本长度超过其宽度时,它应该将文本换行或者应该在新行中显示文本的另一部分。下面是 GridView 代码:
这是我的枚举: enum Foo { [Description("the quick")] Bar, [Description("brown fox")] Baz,
我在 ASP.NET 2.0 中有一个 GridView,其中 AutoGenerateColumns 设置为 true。它将在运行时绑定(bind)到具有多种可能模式之一的 DataSet,而且我不
刚才我遇到了这个奇怪的问题,我想知道是否有我在 VS2012 中遗漏的东西来解决它。我正在使用 MDI Windows 窗体,我有这个 dataGridView,我从数据库中检索数据,然后使用数据库中
我有一个数据表,其中包含在运行时动态生成的列。此 DataTable 绑定(bind)到 AutoGenerateColumns 设置为 true 的 GridView。我遇到了一个问题,因为 Dat
我有一个简单的数据结构类: public class Client { public String name {set; get;} public String claim_numbe
当我将属性 AutoGenerateColumns 设置为 AutoGenerateColumns="true"时,我在设置 gridview 的宽度时遇到了问题。并且 gridview 在代码后面是
如果 AutoGenerateColumns = true,似乎无法操作 Gridview 的列。这是我的场景: 我有一个通用的 GridView,它根据用户的选择显示各种不同 LINQ 查询的结果。
我有一个使用 AutoGenerateColumns=True 绑定(bind)到 DataTable 的 WPF 4.0 DataGrid。这些列是动态的,但是我知道总会有一个名为 ID 的列,我想
我正在为一系列问题而苦苦挣扎。 我有一个动态数据集,我手动将其组装到 DataTable 中。 我必须自动生成列,因为数据不是静态的。 我需要将组合框的 ItemsSource 绑定(bind)到每个
如果我使用OnAutoGenerateColumn取消一些我不一定要生成的列,是否会影响Table.Columns.Count中的列数? 上下文 我正在逐行迭代表,获取每个值并将其传递给插入 SQL
我是一名优秀的程序员,十分优秀!