【问题标题】:WPF Datagrid edit only single cell valueWPF Datagrid 仅编辑单个单元格值
【发布时间】:2012-04-20 13:26:54
【问题描述】:

我有一个 WPF 数据网格,有 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; }

}

非常感谢,

阿努

【问题讨论】:

  • 那么,您希望能够编辑 ParameterName 或 Value 吗?
  • 我只想编辑值。
  • 当 Datagrid 从后面的代码或 XAML 文件加载时,我想在编辑模式下获取 PM2 单元格值
  • 我知道这是一个老问题,但为什么你不在 Value 的列定义中使用 IsReadOnly="false" 呢?

标签: wpf xaml wpfdatagrid


【解决方案1】:

使用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>

【讨论】:

  • 这会在网格中添加一个额外的行,但它仍然不可编辑。看来 WPF 的设计者已经竭尽全力使网格难以编辑。
【解决方案2】:

只需向您的 ParameterSet 添加一个属性,例如。公共布尔 IsEditable {get;set;}

然后您可以在 IsEditable 上使用带有数据触发器的单元格模板来设置是否启用。

编辑:

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 的参数集都可以修改。

【讨论】:

  • 我的意思是如何检查 XAML 或特定值单元格对应于 PM2 的 cs,然后仅将其设置为编辑模式,否则谢谢,
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多