C#/ WPF - 转换器没有被调用?

时间:2017-05-17 08:26:37

标签: c# wpf converter

我想将一些整数转换为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>
但是,这根本不起作用。转换器永远不会被调用。我在这里缺少什么?

3 个答案:

答案 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>