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

时间:2015-02-03 07:48:03

标签: c# wpf 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并在编辑模式下可用。

  3. 我使用IsReadOnly="True", AutoGenerateColumns="False"阻止编辑并避免空白行。休息的事情我没有达到如何实现。

1 个答案:

答案 0 :(得分:0)

  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>
    

  2. 要只保留一个活动行,您可以为除当前行之外的所有RowViewModel重置IsEditing。

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

      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;
                  }
              }
          }
      }