DataGrid模板列绑定

时间:2012-10-18 07:40:28

标签: c# wpf datagrid

我有一个自动生成列的DataGrid。

在Code i中实现AutoGeneratingColumn事件,为我的Translation数据类型设置某个模板:

    private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if(e.PropertyType == typeof(Translation)){
            DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
            templateColumn.CellTemplate = (DataTemplate)Resources["LanguageTemplate"];
            e.Column = templateColumn;
        }

    }

的DataTemplate:

    <DataTemplate x:Key="LanguageTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="20"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Name.ActualTranslation}" HorizontalAlignment="Stretch" Grid.Column="0"></TextBlock>
            <Image Source="{lex:LocImage en}" Height="15" HorizontalAlignment="Right" Grid.Column="1" Visibility="{Binding Name.HasCurrentLanguage, Converter={StaticResource boolToVis}, ConverterParameter=true}" ></Image>
        </Grid>

    </DataTemplate>

现在出现问题:TextBlock绑定到Name Property。如果要显示的对象具有名称属性,则工作正常。但是,如果我有没有命名为“名称”的翻译属性,显然没有显示数据。我将如何正确绑定以涵盖所有翻译项目。

2 个答案:

答案 0 :(得分:0)

创建DataTemplateSelector,可以为当前的翻译类选择正确的DataTemplate,并将其添加到TextBlock.Text绑定中。见more

答案 1 :(得分:0)

因为它看起来像单向绑定,所以用转换器做一个简单的绑定:

TextBlock Text="{Binding Converter={StaticResource your_converter}}" ...

并在转换器中实现您的逻辑。如果您想要绑定不一致的ViewModel,这是最简单的方法。