Действие кнопки для выбранных строк DataGrid в WPF с Caliburn Micro - PullRequest
2 голосов
/ 10 марта 2020

У меня есть DataGrid, и у каждой строки есть Button, который изменяет заданное значение столбца c строки. Я использую 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?

1 Ответ

1 голос
/ 10 марта 2020

Вы можете использовать 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)
    {
        ...
    {
}
...