【问题标题】:Button action for DataGrid selected rows in WPF with Caliburn Micro带有 Caliburn Micro 的 WPF 中 DataGrid 选定行的按钮操作
【发布时间】:2020-03-10 08:03:02
【问题描述】:

我有一个DataGrid,每一行都有一个Button,它改变了行的特定列值。我正在使用Caliburn Micro,并且每一个都完美无缺。我想做的是将Button 放在DataGrid 之外。选择多行然后只按一个“按钮”后,列值会像以前一样发生变化,但这次是针对所有选定的行。以下是我当前代码中的几个 sn-ps:

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 创建一个操作,以便它为DataGrid 的每个选定行触发Validate 方法?

【问题讨论】:

    标签: c# wpf xaml datagrid caliburn.micro


    【解决方案1】:

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

    【讨论】:

    • 现在ButtonDataGrid 之外,我像这样绑定动作:cal:Message.Attach="[Event Click] = [Action ValidateTest($this)]"cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}"ViewModel 中:public void ValidateTest() { foreach (var model in Changes) { if (model.IsSelected) { ... } } } 我收到一条错误消息ChangesModel 没有 IsSelected 的定义
    • 您需要将IsSelected 属性添加到ChangesModel 类。它应该是bool。你可以随意命名。
    • 呃!再次感谢您的帮助伙伴。我还将Button 操作更改为:cal:Message.Attach="[Event Click] = [Action ValidateTest]"。它现在工作正常。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多