带有Caliburn Micro的WPF中DataGrid所选行的按钮动作

问题描述 投票:0回答:1

我有一个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方法产生任何建议吗?

c# wpf xaml datagrid caliburn.micro
1个回答
0
投票

您可以使用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)
    {
        ...
    {
}
© www.soinside.com 2019 - 2024. All rights reserved.