C# Caliburn Micro用于WPF中DataGrid选定行的按钮操作
我有一个C# Caliburn Micro用于WPF中DataGrid选定行的按钮操作,c#,wpf,xaml,datagrid,caliburn.micro,C#,Wpf,Xaml,Datagrid,Caliburn.micro,我有一个DataGrid,每一行都有一个按钮,可以更改行的特定列值。我使用的是Caliburn Micro,每一款都能完美工作。我想做的是将按钮置于数据网格之外。选择多行,然后只按一个`按钮后,列值将像以前一样更改,但这次对所有选定的行更改。以下是我当前代码中的几个片段: DataView.xaml: <DataGrid Grid.Row="1" x:Name="Changes" CanUserAddRows="False" AutoGenerateColumns="Fa
DataGrid
,每一行都有一个按钮
,可以更改行的特定列值。我使用的是Caliburn Micro,每一款都能完美工作。我想做的是将按钮置于数据网格
之外。选择多行,然后只按一个`按钮后,列值将像以前一样更改,但这次对所有选定的行更改。以下是我当前代码中的几个片段:
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>
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);
}
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));
}
}
ChangesModel.cs:
<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>
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);
}
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));
}
}
是否有人建议我如何为按钮创建一个操作,以便它为数据网格的每个选定行触发验证方法?您可以使用行样式
将行的IsSelected
属性绑定到ChangesModel的属性
类别:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</DataGrid.RowStyle>
既然按钮
在数据网格
之外,我就这样绑定操作:cal:Message.Attach=“[Event Click]=[action ValidateTest($this)]”
和cal:action.TargetWithoutContext=“{Binding DataContext,RelativeSource={RelativeSource AncestorType=DataGrid}”
在视图模型中
:公共void ValidateTest(){foreach(var模型正在更改){if(model.IsSelected){…}
我收到一个错误,指出ChangesModel
没有IsSelected
的定义。您需要将IsSelected
属性添加到ChangesModel
类中。它应该是一个bool
。你想叫什么名字都行。哼!再次感谢你的帮助,伙计。我还将按钮
操作更改为:cal:Message.Attach=“[Event Click]=[action ValidateTest]”
。现在很好用。干杯