2

WPF DataGrid に条件付き書式を適用しようとしています。要件は次のとおりです。グリッド上の任意のセルで、コンテンツが整数の場合、表示形式は小数点以下 0 桁にする必要があります。内容に小数点以下の桁数がある場合は、stringformat で定義されたデフォルト値で表示します。

この種の条件付き書式設定をどのように達成できるかについて、誰かが考えを持っていますか? 小数の存在を確認できるコンバーターを作成しましたが、これを XAML でセル スタイルまたはテキスト列に適用する方法を理解できませんでした。

セル スタイル - これは私が定義したいスタイルです

<Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

グリッド列 - この列に適用されるスタイルを適用します

<DataGridTextColumn x:Key="ColumnName"
                    Header="ColumnName"
                    SortMemberPath="MyColumnSort"
                    Binding="{Binding myColBinding, StringFormat={}{0:N2}}"
                    IsReadOnly="True"
                    Width="40" />

コンバーター - このコンバーターを使用して、このスタイルが適用されるかどうかを判断します。

public class NoDecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int converted;
            int.TryParse(value.ToString(), out converted);
            value.ToString();
            return int.TryParse(value.ToString(), out converted);
        }

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

以下のようにセル スタイルにデータトリガーを追加して実行しようとしましたが、「型 'System.Windows.Controls.DataGridCell' でスタイル プロパティ 'StringFormat' が見つかりません」というエラーが表示されました。

    <Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Style.Triggers>             
            <DataTrigger Binding="{Binding NoDecimalConvertor}" Value="False" >                 
                <Setter Property="StringFormat" Value="true" />             
            </DataTrigger>         
        </Style.Triggers>     
</Style>

私はこれに対して何日も頭を悩ませてきたので、これにアプローチする最善の方法についてのガイダンスをいただければ幸いです。

4

1 に答える 1

4

コンバーターは現在、文字列値から整数を解析できるかどうかを示すブール値を返しています。代わりに、次のようなことを試してください。

public class NoDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int converted;
        if (int.TryParse(value.ToString(), out converted))
             return converted.ToString();

        double convertedDouble;
        if (double.TryParse(value.ToString(), out convertedDouble))
             return convertedDouble.ToString();

        return value;
    }

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

これは最初にintの解析を試み、成功した場合はそれを(文字列として)返します。そうでない場合は、doubleを試行して返します。ここでは、任意の文字列形式を指定して、必要な小数点以下の桁数などを取得できます。最後に、どちらも解析できない場合は、元の値を返します。

次に、以下を使用して列に設定できます。

<DataGridTextColumn x:Key="ColumnName"
                Header="ColumnName"
                SortMemberPath="MyColumnSort"
                Binding="{Binding myColBinding, Converter={StaticResource MyConverter}}"
                IsReadOnly="True"
                Width="40" />

注:リソースのどこかで、キーを使用してコンバーターをインスタンス化する必要がありますMyConverter

デフォルトの小数点以下の桁数を指定できるようにする場合は、コンバーターパラメーターとして渡すことができます。

于 2012-01-26T17:00:57.287 に答える