我有一个DataGrid
,每行都有一个Button
,它会更改行的特定列值。我正在使用Caliburn Micro
,并且每个都工作正常。我想做的是将Button
移到DataGrid
之外。选择多行然后仅按一个按钮后,列值将像以前一样更改,但这一次是所有选定行。这是我当前代码中的几段代码:
DataView.xaml:
<DataGrid Grid.Row="1" x:Name="Changes" CanUserAddRows="False"
AutoGenerateColumns="False" AlternatingRowBackground="#FFF7F7F7">
<DataGrid.Columns>
<DataGridTextColumn ... />
<DataGridTextColumn ... />
<DataGridTemplateColumn CellStyle="{StaticResource DataGridCellCentered}" Header="Validation">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button Margin="20 0 20 0" Visibility="{Binding DataContext.Validated,
Converter={StaticResource BoolToVisConverter}, RelativeSource={RelativeSource AncestorType=DataGridCell}}"
cal:Message.Attach="[Event Click] = [Action Validate($this)]" Cursor="Hand"
cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}">
Validate
</Button>
<StackPanel Orientation="Horizontal" Margin="20 0 20 0"
Visibility="{Binding DataContext.Validiert,
Converter={StaticResource BoolToVis}, RelativeSource={RelativeSource AncestorType=DataGridCell}}">
<TextBlock>Validated</TextBlock>
<Button Margin="20 0 0 0" Padding="10 0 10 0" FontSize="25" Foreground="#FF2F5778"
cal:Message.Attach="[Event Click] = [Action Unvalidate($this)]" Cursor="Hand"
cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}" >
⮌
</Button>
</StackPanel>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
DataViewModel.cs:
public void Validate(ChangesModel model)
{
model.Validated= true;
model.ValidateDate = DateTime.Now;
model.ValidatedBy = LoggedUser.loggedUser;
db.CheckValidate(model);
}
public void Unvalidate(ChangesModel model)
{
model.Validated= false;
model.ValidateDate = null;
model.ValidatedBy = null;
db.UnCheckValidate(model);
}
ChangesModel.cs:
public class ChangesModel : INotifyPropertyChanged
{
private bool _validated;
public bool Validated
{
get { return _validated; }
set { _validated= value; NotifyPropertyChanged(); }
}
private DateTime? _validatedate;
public DateTime? ValidateDate
{
get { return _validatedate; }
set { _validatedate= value; NotifyPropertyChanged(); }
}
private string _validatedBy;
public string ValidatedBy
{
get { return _validatedBy; }
set { _validatedBy= value; NotifyPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
有人对我如何为Button
创建一个动作以使它为Validate
的每个选定行激发DataGrid
方法产生任何建议吗?
您可以使用RowStyle
将行的IsSelected
属性绑定到ChangesModel
类的属性:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</DataGrid.RowStyle>
然后将按钮绑定到仅迭代选定模型的动作,例如:
foreach (var model in Changes)
{
if (model.IsSelected)
{
...
{
}