我正在尝试使用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之外,我试图在没有任何代码的情况下执行此操作。
答案 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... */
}
我希望它有所帮助。