绑定 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... */
}
希望对您有所帮助。
我正在尝试获取一个 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... */
}
希望对您有所帮助。