我有一个WPF Datagrid,其中有2列表示参数名称和值。
我的要求只是一个特定参数名称的值(单元格内容)应该是可编辑的,整个Datagrid内容应该只读....
我有一个保存按钮来保存值。
我几天来一直在研究一个适当的解决方案,在许多情况下这是一个常见的要求,但我还没找到......
请提出任何解决方案或想法。
这是XAML& cs:当Datagrid加载时,我只希望PM2单元格值处于编辑模式,而所有其他datagrid内容应该是灰色或不可编辑的。
<Grid>
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"
Margin="20,57,18,19" Name="dataGrid1"
Height="250" SelectionUnit="Cell" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ParameterName}" Width="100" Header="Parameter Name" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Value}" Width="100" Header="Value" />
</DataGrid.Columns>
</DataGrid>
</Grid>
我的CS代码
public partial class dgSF : Window
{
ObservableCollection<ParameterSet> pmset;
public dgSF()
{
InitializeComponent();
pmset = new ObservableCollection<ParameterSet>();
pmset.Add(new ParameterSet() { ParameterName = "PM1", Value = 10 });
pmset.Add(new ParameterSet() { ParameterName = "PM2", Value = 50 });
pmset.Add(new ParameterSet() { ParameterName = "PM3", Value = 70 });
pmset.Add(new ParameterSet() { ParameterName = "PM4", Value = 80 });
pmset.Add(new ParameterSet() { ParameterName = "PM5", Value = 100 });
dataGrid1.ItemsSource = pmset;
}
}
public class ParameterSet
{
public string ParameterName { get; set; }
public int Value { get; set; }
}
非常感谢,
阿努
答案 0 :(得分:3)
使用DataGridTemplateColumn
并为您希望能够编辑的列定义CellTemplate
和CellEditingTemplate
。对于您不想编辑的列,只需定义CellTemplate
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"
Margin="20,57,18,19" Name="dataGrid1"
Height="250" SelectionUnit="Cell">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ParameterName}" Width="100" Header="Parameter Name" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Editable Value">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Value}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
答案 1 :(得分:1)
只需向ParameterSet添加一个属性,例如。 public bool IsEditable {get; set;}
然后你可以在IsEditable上使用带有datatrigger的单元格模板来设置是否启用。
编辑:
public class ParameterSet
{
public ParameterSet()
{
IsEditable = false;
}
public string ParameterName { get; set; }
public int Value { get; set; }
public bool IsEditable { get; set; }
}
XAML
<DataGrid ItemsSource="{Binding Pmset}" AutoGenerateColumns="False" SelectionUnit="Cell" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ParameterName}" Width="100" Header="Parameter Name" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Value}" Width="100" Header="Value" >
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsEnabled" Value="False"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsEditable}" Value="true">
<Setter Property="IsEnabled" Value="True"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
在xaml中,您只需声明一个样式,即每个单元格都不可编辑,但IsEditable = true的样式除外。所以每个具有IsEditable = true的Parameterset都可以被修改。