4

WPFでのデータバインディングの基本を理解するのに問題があります。読み込みごとに異なる列名を持つDataTableにバインドされた汎用DataGrid(AutoGenerateColumnsが設定されている)があります。dataTableにブール型の列が含まれている場合、trueとfalseを表すカスタム画像を含む列をレンダリングしたいと思います。

これを実現するために、celltemplateのページでStaticResourceを宣言し、AutoGenerateColumnイベントをトラップしてこのテンプレートを使用するc#コードを作成しました。

<DataTemplate x:Key="CheckmarkColumnTemplate">
    <Image x:Name="CheckmarkImage" Source="..\..\images\check.png" Height="16" Width="16" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Value="False">
            <Setter TargetName="CheckmarkImage" Property="Source" Value="..\..\images\nocheck.png" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

C#コード:

private void dgData_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(bool))
    {
        DataGridTemplateColumn col = new DataGridTemplateColumn();
        Binding binding = new Binding(e.PropertyName);
        col.CellTemplate = (this.Resources["CheckmarkColumnTemplate"] as DataTemplate);
        col.Header = e.PropertyName;
        e.Column = col;
    }
}

DataTrigger Bindingプロパティがめちゃくちゃになっていることを除いて、これはほとんど機能します。列の値が「false」の場合は検出されないため、nocheck.png画像は表示されません。列のデータバインドされた値を参照するようにBindingプロパティを作成する方法がわかりません(列名は毎回異なるため、バインディングのPath部分に列名をハードコーディングすることはできません) 。

列の値を取得するためにBindingプロパティがどのように表示されるかを誰かに教えてもらえますか?

4

2 に答える 2

2

私は同じ問題を抱えており、まだ答えを探しています。私の現在の解決策は、DataTemplateinAutoGeneratingColumnイベントハンドラーを作成しDataTemplateて、プロパティ名を知ることです。

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    e.Column = new DataGridTemplateColumn
    {
        Header = e.PropertyName,
        CellTemplate = CreateSimpleCellTemplate(e.PropertyName)
    }
}

private static DataTemplate CreateSimpleCellTemplate(string propertyName)
{
    DataTemplate template = new DataTemplate();
    template.VisualTree = new FrameworkElementFactory(typeof(Label));
    template.VisualTree.SetBinding(ContentProperty, new Binding(propertyName));
    return template;
}
于 2012-04-08T04:57:16.880 に答える
1

別の方法を使用して、目的の結果を達成しました。DataGridTemplateColumn を使用する代わりに、DataGridCheckBoxColumn を使用し、WPF ツールキットの「ハンズオン ラボ」で使用されているサンプル スタイルに基づいてカスタム ElementStyle を設定しました。

<Style x:Key="NoBorderCheckBoxStyle" TargetType="{x:Type CheckBox}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
    <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="IsEnabled" Value="false"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
                <BulletDecorator SnapsToDevicePixels="true" Background="Transparent">
                    <BulletDecorator.Bullet>
                        <Canvas x:Name="canvas"  Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5">
                            <Image x:Name="checkImage" Source="..\..\images\check.png" Height="16" Width="16"></Image>
                        </Canvas>
                    </BulletDecorator.Bullet>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
                </BulletDecorator>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent" Value="True">
                        <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
                        <Setter Property="Padding" Value="4,0,0,0"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="False">
                        <Setter Property="Source" TargetName="checkImage" Value="..\..\images\nocheck.png" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

実際の DataGrid 列設定 (そのプロパティは "IsReadOnly") から "IsEnabled" プロパティを読み取る際に問題がありましたが、DataGrid の使用は読み取り専用であるため、ここでは false に設定しました。

于 2009-05-07T19:53:17.243 に答える