【问题标题】:How to set a row for editing on a button click in GridView如何在GridView中单击按钮设置一行进行编辑
【发布时间】:2015-02-03 07:48:02
【问题描述】:

我有一个 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>

默认情况下,不允许用户编辑此网格视图。

要求是

  1. 当用户单击行中的编辑按钮时,只需要启用该特定行进行编辑,其余行应被锁定,无法编辑。 进一步点击该按钮,只有编辑应该可用,而不是点击 gridview 单元格。

  2. 那么默认情况下,额外的行不应该存在,并且我在网格外有一个按钮,单击新的空白行必须添加到网格视图并在编辑模式下可用。

    李>

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

【问题讨论】:

    标签: c# wpf gridview


    【解决方案1】:
    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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2017-06-26
      相关资源
      最近更新 更多