绑定 ICommand WPF ObservableCollection DataGrid

Binding ICommand WPF ObservableCollection DataGrid

我正在尝试获取一个 WPF MVVM 模板来处理我在 WPF 但非 MVVM 应用程序中执行的基本功能。在这种情况下,我试图捕获 RowEditEnding 事件(我就是)来验证已更改的行上的数据(这就是问题所在)。

在XAML我使用了一个事件触发器:

        <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
                      ItemsSource="{Binding oDoc.View}">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="docIDColumn" Binding="{Binding DocId}" Header="ID" Width="65"/>
            <DataGridTextColumn x:Name="DocumentNumberColumn" Binding="{Binding Number}" Header="Document Number" Width="*"/>
            <DataGridTextColumn x:Name="altIDColumn" Binding="{Binding AltID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Alt" Width="55"/>
        </DataGrid.Columns>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="RowEditEnding">
                <i:InvokeCommandAction Command="{Binding DocRowEdit}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>

使用委托命令路由到处理程序:

        public ObservableCollection<Document> oDoc
    {
        get
        {
            return _oDoc;
        }
    }

    public ICommand DocRowEdit
    {
        get { return new DelegateCommand(DocumentRowEditEvent); }
    }

    public void DocumentRowEditEvent()
    {
        //How do I find the changed item?
        int i = 1;
    }

我还没有找到一种方法来查找具有未决更改的 ObservableCollection (oDoc) 成员。我注意到数据网格正在进行一些验证,如果我输入非数值,我想要更改的 AltID 字段将突出显示为红色。但我想自己处理验证和相关的消息传递。我错过了什么?我正在考虑以某种方式引发 属性 更改的事件,但找不到如何连接这样的东西:

        protected void RaisePropertyChangedEvent(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

最后两个代码块来自我的 ViewModel class,除了在 MainWindow 构造函数中实例化 ViewModel 之外,我正在尝试在没有任何代码的情况下执行此操作。

您可以将 属性 添加到您的 ViewModel:

public Document CurrentDocument
{
    get
    {
        return _currentDocument;
    }
    set
    {
        if (value != _currentDocument)
        {
            _currentDocument = value;
            OnPropertyChanged("CurrentDocument") // If you implement INotifyPropertyChanged
        }
    }
}

然后您可以将它绑定到 DataGrid 的 SelectedItem 属性:

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
                      ItemsSource="{Binding oDoc.View}" SelectedItem="{Binding CurrentDocument}">

因此您的编辑方法将是:

public void DocumentRowEditEvent()
{
    CurrentDocument.Number = DateTime.Now.Ticks;
    /* And so on... */
}

希望对您有所帮助。