6

以下に定義されているテンプレート列を持つWPFデータグリッドがあります。

<DataGridTemplateColumn x:Name="ciDelete" Header="Delete">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button x:Name="btnDelete" HorizontalAlignment="Center" Margin="0" Click="btnDelete_Click" Tag="{Binding Path=ciID}" VerticalAlignment="Center">
                <Image Source="Resources/16x16/delete.png" Stretch="Fill" />
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

これは表示され、うまく機能します。ただし、ボタンは新しいアイテムの行に表示されます(下)。これは削除ボタンなので、「新規アイテム」の行には表示したくありません。

に示されているボタン

新しい行のスタイリングに関するこの記事を見ましたが、これは少し極端に思えます。「新しい行」のボタンだけを非表示にするもっと簡単な方法があるかどうか知りたいと思いました。ご協力ありがとうございました。

4

1 に答える 1

10

私の場合は、DataGridRowのデータコンテキストがNewItemPlaceholderであるかどうかを判断するためのクイックコンバーターを作成します。

public class IsNamedObjectVisibilityConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.GetType().Name == "NamedObject")
        {
            return Visibility.Hidden;
        }
        else
        {
            return Visibility.Visible;
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}

次に、RelativeSourceバインディングをDeleteButtonVisibilityに追加します。

<DataGridTemplateColumn x:Name="ciDelete" Header="Delete">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button x:Name="btnDelete" HorizontalAlignment="Center" Margin="0" Click="btnDelete_Click" Tag="{Binding Path=ciID}" VerticalAlignment="Center"
                 Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}, Path=DataContext, Converter={StaticResource IsNamedObjectVisibilityConverter}}">
                <Image Source="Resources/16x16/delete.png" Stretch="Fill" />
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

それが最善のアプローチである場合とそうでない場合がありますが、機能するはずです。

これがお役に立てば幸いです。

編集:簡潔にするために、上記のコンバーターのインスタンスを作成する部分をスキップしたことは明らかだと思います。この例では、クラスの正確な名前でConverterのインスタンスがあることを前提としています。おそらく明白ですが、言及する価値があります。:)

于 2012-11-26T20:32:29.530 に答える