繁体   English   中英

使用 Caliburn Micro 在 WPF 中选择 DataGrid 行的按钮操作

[英]Button action for DataGrid selected rows in WPF with Caliburn Micro

我有一个DataGrid ,每行都有一个Button ,它更改行的特定列值。 我正在使用Caliburn Micro并且每个都运行良好。 我想做的是将Button放在DataGrid之外。 选择多行然后只按下一个`按钮后,列值会像以前一样改变,但这次是针对所有选定的行。 以下是我当前代码中的几个片段:

数据视图.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>

数据视图模型.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创建一个动作有任何建议,以便它为DataGrid每个选定行触发Validate方法?

您可以使用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)
    {
        ...
    {
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM