绑定ICommand WPF ObservableCollection DataGrid

时间:2015-02-03 00:57:53

标签: c# wpf mvvm 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类,除了在MainWindow构造函数中实例化ViewModel之外,我试图在没有任何代码的情况下执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以向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... */
}

我希望它有所帮助。