C#/ WPF - 使用if子句使DataGrid只读

时间:2017-05-17 07:38:20

标签: c# wpf datagridview datagrid

我有DataGrid这样:

    <DataGrid Name="studentGrid" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding Students, Mode=TwoWay}" >
        <DataGrid.Columns>
            <DataGridTextColumn IsReadOnly="True" Header="Student's name" Binding="{Binding StudentName}" />
            <DataGridTextColumn IsReadOnly="True" Header="Student's username" Binding="{Binding StudentUserName}" />
            <DataGridTextColumn IsReadOnly="True" Header="Date of application" Binding="{Binding DateOfApplication}"  />
            <DataGridTextColumn IsReadOnly="False" Header="Student's grade" Binding="{Binding StudentGrade}"/>
        </DataGrid.Columns>
    </DataGrid>

现在正在运行,但是,我想添加一些功能,即我希望Student's grade列只有在等级高于1时才能读取。我会继续看到像{{}这样的解决方案3}},人们以编程方式使用DataGridVIEW。但是,我似乎无法向我的XAML添加DataGridVIEW,只能添加一个DataGrid。当我尝试做类似的事情时:

public MainWindow()
{
    foreach (var row in studentGrid)
    {
        if (row[3] > 1) {
            row[3].isReadOnly = false;
        }
    }
    InitializeComponent();
}

我不能,因为DataGrid没有枚举器。我也无法使用studentGrid.Row

之类的内容访问其行

所以我的问题是,DataGrid与DataGridView的使用有何不同,我如何添加if-else验证以使DataGrid列中的某些行可编辑,但其他行不可编辑?

谢谢!

更新

所以我创建了一个转换器,但是我在使用它时遇到了麻烦。我试图在XAML中引用它:

<Window x:Class="TanulmanyiRendszer.Admin.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib" 
        xmlns:viewModel="clr-namespace:TanulmanyiRendszer.Admin.ViewModel"
        Title="Courses" Height="600" Width="500">
    <Window.Resources>
        <viewModel:GradeToReadOnlyConverter x:Key="converter" />
    </Window.Resources>

但是我收到了一个错误:

  

命名空间中不存在名称“GradeToReadOnlyConverter”   “CLR-名称空间:TanulmanyiRendszer.Admin.ViewModel”。

即使转换器明显存在于该命名空间中:

namespace TanulmanyiRendszer.Admin.ViewModel
{
    public class GradeToReadOnlyConverter : IValueConverter
    {

2 个答案:

答案 0 :(得分:0)

您可以使用转换器。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value is int) {
            var gradeVal = (int)value;
            return gradeVal > 1;
        } else
            return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }

更新。 在研究This link

之后

我更新了xaml,因为Datagrid列不被视为控件,因此您无法为其分配转换器。我已经做了一个小解决方案来解决您的问题

<DataGridTextColumn Binding="{Binding StudentGrade}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=StudentGrade,Converter={StaticResource yourConverter}}" Value="True">
                                <Setter Property="IsEnabled" Value="False"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

答案 1 :(得分:0)

您可以使用EditingElementStyle根据转换器返回的值停用TextBox

<DataGrid Name="studentGrid" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False"
                  ItemsSource="{Binding Students, Mode=TwoWay}" >
    <DataGrid.Resources>
        <Style x:Key="ReadOnlyStyle" TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding StudentGrade, Converter={StaticResource converter}}" Value="True">
                    <Setter Property="BorderThickness" Value="0" />
                    <Setter Property="IsEnabled" Value="False" />
                    <Setter Property="Background" Value="Transparent" />
                    <Setter Property="TextWrapping" Value="Wrap" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="True" Header="Student's name" Binding="{Binding StudentName}" />
        <DataGridTextColumn IsReadOnly="True" Header="Student's username" Binding="{Binding StudentUserName}" />
        <DataGridTextColumn IsReadOnly="True" Header="Date of application" Binding="{Binding DateOfApplication}"  />
        <DataGridTextColumn Header="Student's grade" Binding="{Binding StudentGrade}" EditingElementStyle="{StaticResource ReadOnlyStyle}"/>
    </DataGrid.Columns>
</DataGrid>