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]”
。现在很好用。干杯