WPF Datagrid仅编辑单个单元格值

时间:2012-04-20 13:26:54

标签: wpf xaml wpfdatagrid

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

}

非常感谢,

阿努

2 个答案:

答案 0 :(得分:3)

使用DataGridTemplateColumn并为您希望能够编辑的列定义CellTemplateCellEditingTemplate。对于您不想编辑的列,只需定义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都可以被修改。

相关问题