我有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
{
答案 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>