gpt4 book ai didi

wpf - MVVM - WPF DataGrid - AutoGenerateColumn 事件

转载 作者:行者123 更新时间:2023-12-01 18:59:31 25 4
gpt4 key购买 nike

我目前正在仔细研究 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com