繁体   English   中英

如何在GridView中设置行以进行按钮单击编辑

[英]How to set a row for editing on a button click in GridView

我有一个GridView,其中包含一些DataGridTextColumn和一个具有按钮控件的DataGridTemplateColumn

<DataGrid Name="dgProductList" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" AutoGenerateColumns="False"
          RowBackground="{StaticResource MainBackground}" RowHeight="30"
          GridLinesVisibility="None" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Id}" Header="Id" Visibility="Hidden" 
                            FontFamily="verdana"  />
        <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" 
                            FontFamily="verdana"/>
        <DataGridTextColumn Binding="{Binding Path=Amount}" Header="Amount" 
                            FontFamily="verdana"  />
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Name="btnEdit" Width="117"  Style="{StaticResource GlossButtonStyle}" 
                            Click="btnEdit_Click" >Edit</Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

默认情况下,不允许用户编辑此gridview。

要求是

  1. 当用户单击该行中的“编辑”按钮时,仅需要启用该特定行才能进行编辑,其余行应被锁定,无法编辑。 此外,在单击该按钮时,只有在单击gridview单元格时才可以进行编辑。

  2. 然后默认情况下该多余的行不应该存在,并且我在网格外部有一个按钮,单击该新的空白行后,必须将其添加到gridview并在编辑模式下可用。

我使用IsReadOnly="True", AutoGenerateColumns="False"阻止了Edit并避免出现空白行。 休息的东西我没有得到如何实现。

  1. 您可以为每行创建ViewModel并向其添加IsEditing属性。 您可以从以下内容开始:

     <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid> <ToggleButton x:Name="btnEdit" IsChecked="{Binding IsEditing,Mode=TwoWay}">Edit</ToggleButton> <TextBox Visibility="{Binding IsEditing,Converter=yourfavorite}" Text="{Binding Path=., Mode=TwoWay}"/> </Grid> </DataTemplate> 

若要仅保留一个活动行,可以为当前行以外的所有RowViewModel重置IsEditing。

  1. 您的外部按钮处理程序将在Grid的viewModel上调用AddNewRow()方法。

}

class RowViewModel
{
    GridViewModel parent;
    public RowViewModel(GridViewModel parent)
    {
        this.parent = parent;
    }

    public string Id { get; set; }
    public string Name { get; set; }
    public string Amount { get; set; }
    public string Value { get; set; }
    public bool IsEditing 
    {
        get { return this == parent.ActiveRow; }
        set 
        { 
            if (value) 
                parent.ActiveRow = this;
            NotifyChange();
        }
    } 
}


class GridViewModel  
{  
    private RowViewModel activeRow;  
    public ObservableCollection<RowViewModel> Rows { get; private set; }

    public GridViewModel()
    {
        Rows = new ObservableCollection<RowViewModel>();
    }

    public void AddNewRow()
    {
        Rows.Add(new RowViewModel(this) { IsEditing = true });
    }

    public RowViewModel ActiveRow 
    {
        get { return activeRow;}
        set 
        {
            activeRow = value;
            foreach (var row in Rows.Except(new[] { activeRow })) 
            {
                row.IsEditing = false;
            }
        }
    }
}

暂无
暂无

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

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