我想将一些整数转换为DataGrid列的ReadOnly值。为此,我要做以下事情:
namespace TanulmanyiRendszer.Admin.ViewModel
{
public class GradeToReadOnlyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Boolean IsReadOnly = (Int32.Parse((String)value) < 2) ? true : false;
return IsReadOnly;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}
XAML查看
<Window x:Class="TanulmanyiRendszer.Admin.View.MainWindow"
<!-- ETC -->
xmlns:viewModel="clr-namespace:TanulmanyiRendszer.Admin.ViewModel"
Title="Courses" Height="600" Width="500">
<Window.Resources>
<viewModel:GradeToReadOnlyConverter x:Key="converter" />
</Window.Resources>
<!-- ETC -->
<DataGrid Name="studentGrid" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding Students, Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="{Binding StudentGrade, Converter={StaticResource converter}}" Header="Student's grade" Binding="{Binding StudentGrade}"/>
</DataGrid.Columns>
</DataGrid>
</Window>
但是,这根本不起作用。转换器永远不会被调用。我在这里缺少什么?
答案 0 :(得分:1)
<DataGridTextColumn Header="Student's grade" Binding="{Binding StudentGrade}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsHitTestVisible" Value="{Binding StudentGrade, Converter={StaticResource converter}}" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
尝试更改DataGridCell
的样式。
Setter Property可能是'IsHitTestVisible&#39;或者&#39;的IsEnabled&#39;
答案 1 :(得分:0)
然而,这根本不起作用。
这是此方案中的预期行为。这背后的原因是Datagrid列不是Visual Tree的一部分,这就是Datagrid列未连接到Datagrid的Datacontext的原因。因此,与Datagrid Column的IsReadOnly属性绑定不起作用。可以找到针对此方案的良好解决方案(黑客/解决方法)here。
如果您对所提供链接的解决方案有任何帮助,请与我们联系。
答案 2 :(得分:0)
我在这里缺少什么?
DataGridTextColumn
未继承任何DataContext
这意味着您无法将其IsReadOnly
属性直接绑定到StudentGrade
源属性。
请参阅@Thomas Levesque的博客文章,了解有关此问题的更多信息,以及如何使用BindingProxy
继承自Freezable
的{{1}}类并捕获DataContext
来解决您的问题: https://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/
虽然为列简单定义自定义EditingElementStyle
会更容易。试试这个:
<DataGridTextColumn IsReadOnly="{Binding StudentGrade, Converter={StaticResource converter}}"
Header="Student's grade" Binding="{Binding StudentGrade}">
<DataGridTextColumn.EditingElementStyle>
<Style 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>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>