我有一个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。
要求
当用户单击行中的编辑按钮时,只需要启用该特定行进行编辑,其他行应该被锁定以免编辑。 进一步点击该按钮,只有点击gridview单元格才能进行编辑。
然后默认情况下,这个额外的行不应该存在,并且我有一个网格外的按钮,点击该新的空白行必须添加到gridview并在编辑模式下可用。
我使用IsReadOnly="True", AutoGenerateColumns="False"
阻止编辑并避免空白行。休息的事情我没有达到如何实现。
答案 0 :(得分:0)
您可以为每一行创建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。
}
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;
}
}
}
}