在WPF MVVM中从额外的DataGrid行删除空对象

在WPF MVVM中从额外的DataGrid行删除空对象,wpf,mvvm,Wpf,Mvvm,在用户控件中有一个DataGrid绑定到一个对象的ObservableCollection。我已经将CanUserAddRows设置为true,因为这是我想要的功能。但是,当我关闭该窗口时,用户添加的任何额外的空白行都会添加到我的ObservableCollection中。如果我的ObservableCollection中的这些额外项是空的,并且符合MVVM的要求,那么有什么方法可以将它们从我的ObservableCollection中删除?执行类似操作的“MMVM方法”是使用事件触发器从Vie

在用户控件中有一个DataGrid绑定到一个对象的ObservableCollection。我已经将CanUserAddRows设置为true,因为这是我想要的功能。但是,当我关闭该窗口时,用户添加的任何额外的空白行都会添加到我的ObservableCollection中。如果我的ObservableCollection中的这些额外项是空的,并且符合MVVM的要求,那么有什么方法可以将它们从我的ObservableCollection中删除?

执行类似操作的“MMVM方法”是使用事件触发器从ViewModel中调用绑定到视图的命令。要使用事件触发器,您需要WPF的交互性扩展。你可以从NuGet那里拿到这个

Install-Package System.Windows.Interactivity.WPF
这提供了
EventTrigger
,用于在事件发生时调用命令。现在需要将此触发器添加到窗口XAML中,并将触发器操作设置为调用命令。例如,这里我正在设置一个命令,以便在窗口的
关闭
事件中调用该命令

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding RemoveEmptyEntries}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        
    </Grid>
</Window>
请注意,
RelayCommand
在创建时执行一个
操作
,并在执行命令时调用该
操作

最后,向ViewModel添加一个类型为
RelayCommand
的新属性,例如

public class DataRowsViewModel
{
    public RelayCommand RemoveEmptyEntries => new RelayCommand(RemoveEmptyEntriesExecuted);

    private void RemoveEmptyEntriesExecuted()
    {
        //Remove empty rows here.
    }
}

现在,删除空行的逻辑可以放到
removeMptyEntriesExecuted
方法中。

处理视图模型中窗口的关闭,并删除仅具有默认值的最后一项。您是否使用任何特定的MVVM框架?我没有使用任何MVVM框架-只是标准样板代码。谢谢你,杰森,我非常感激!我可以问一下-这是否也可以通过附加属性实现?如果可以,使用一个属性比使用另一个属性有好处吗?很高兴这是有用的!是的,您可以创建一个
OnClosingCommand
,它是一个可附加属性,具有处理关闭事件和调用绑定命令的逻辑。在我看来,哪一个更好是个人的偏好。如果你想使用重型MVVM,我会倾向于使用交互,因为其他任何有MVVM经验的人都会熟悉它们。这对快速开发也有好处;创建可附加属性变得很麻烦。但是可附加属性的优点是不涉及额外的程序集和学习新的触发器。所以我想说,这是对您(和您的团队)最有效的方法。^我刚刚意识到您可能指的是一个可附加属性,用于实际删除空行。这也是可能的,某种类型的
clearpontyrowsonexit
type属性肯定可以工作。这将删除需要的
RelayCommand
和触发器。所以在我看来这并不是错的,但是如果你想使用重型MVVM,我会倾向于视图模型和中继命令中的逻辑。从长远来看,你会想要的。
public class DataRowsViewModel
{
    public RelayCommand RemoveEmptyEntries => new RelayCommand(RemoveEmptyEntriesExecuted);

    private void RemoveEmptyEntriesExecuted()
    {
        //Remove empty rows here.
    }
}