1

我有一个带有 2 列的 WPF 数据网格,表示参数名和值。

我的要求只是特定参数名的一个值(单元格内容)应该是可编辑的,并且整个 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; }

}

非常感谢,

阿努

4

2 回答 2

3

使用 a并为您希望能够编辑的列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>
于 2012-04-20T13:48:34.867 回答
1

只需向您的 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; }

}

xml

    <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 的每个参数集。

于 2012-04-20T13:39:55.660 回答