1

私の質問がここですでにいくつかの方法で述べられ、回答されたことを知っています。しかし、思い通りに動かすことができません。タイトルが示すように、内容に応じてデータグリッドセルの背景色を変更しようとしています。私はWPFに比較的慣れていませんが、解決策はバインディングと組み合わせたコンバーターだと思います。目標は、4 つの状態を持つ列挙型である "Status" と呼ばれるプロパティに応じて、セルの背景色を変更することです。

私はすでにコンバーターを書いています:

using System;
using System.Windows.Data;
using System.Drawing;
using System.Windows;

namespace Admin
{
    [ValueConversion(typeof(Member.UserStatus), typeof(Brushes))]
    public class StatusToColorConverter : IValueConverter
    {
        #region IValueConverter Member

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var enumValue = (Member.UserStatus)value;

            if(enumValue == Member.UserStatus.Change)
                return Brushes.Red;
            if(enumValue == Member.UserStatus.Import)
                return Brushes.Blue;
            if(enumValue == Member.UserStatus.Remove)
                return Brushes.Orange;
            if(enumValue == Member.UserStatus.Synced)
                return Brushes.Green;
            else
                return DependencyProperty.UnsetValue;
        }

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

        #endregion
    }
}

ここまでは順調ですね。xaml 部分は次のようになります (いくつかのグーグルの後...)

<DataGrid.Columns>              
    <DataGridTemplateColumn Header="Status">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Status}" Background="{Binding Status, Converter={StaticResource StatusToColorConverter}}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns> 

DataGridTemplateColums と DataTemplates が何であるかは (まだ) わかりません。しかし、私はCellStyleと私が覚えていない別の方法で同じことを試みました. コンバーターにはブレークポイントがあり、私が試したすべてのソリューションで呼び出されます。しかし、どういうわけか、「Background」プロパティはコンバーターからの戻り値を無視しているようです。したがって、私の過ち (または私の理解不足) には別の原因があると思います。

誰かが私を正しい方向に向けたいと思っていますか?

4

3 に答える 3

3

XAML を正しく解釈すると、セル自体ではなく、列 HEADER (「一番上の」セル) が描画されます。

これは私のために働く:

<DataGrid.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="{Binding Status},
                       Converter={StaticResource StatusToColorConverter}">
                    </Setter>
                </Style>
</DataGrid.CellStyle>

これにより、セルがペイントされます

補足として、背景をペイントしている場合、セルが「奇妙」に見える場合があります。セルは境界線などを失うことがよくあります。すばやく簡単に修正するには、次のプロパティ セッターを追加します (デフォルトの wpf スタイルです)。

 <Setter Property="BorderThickness" Value="1,0,1,1"></Setter>
 <Setter Property="BorderBrush" Value="#FF000000"></Setter>
于 2013-07-16T08:21:13.920 に答える
1

わかりました。私は今問題を解決しました。問題は私の xaml コードではありませんでした。コンバーターも正常に動作しました。問題は、コンバーター .cs ファイルの次の行でした。

    using System.Drawing;

私はそれを正しいものに置き換えました:

    using System.Windows.Media;

そして今、それは魅力のように機能します。... WPF ブラシの代わりに WinForms 用のブラシを渡していました!

とにかくすべての助けをありがとう:)

于 2013-07-16T10:00:04.483 に答える
1

私はこのようにしました:

              <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="Background">
                            <Setter.Value>
                                <Binding Path="Row" Mode="OneWay" />
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>

DataGrid への ItemsSource として DataView を使用しているため、「Row」にバインドしていることに注意してください。Item は基本的に DataRowView よりです。次に、コンバーターで行の値にアクセスする必要があります。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        var enumValue = (Member.UserStatus)((DataRow)value)["Status"];
        if(enumValue == Member.UserStatus.Change)
            return Brushes.Red;
        if(enumValue == Member.UserStatus.Import)
            return Brushes.Blue;
        if(enumValue == Member.UserStatus.Remove)
            return Brushes.Orange;
        if(enumValue == Member.UserStatus.Synced)
            return Brushes.Green;
        else
            return DependencyProperty.UnsetValue;
    }
于 2013-07-16T08:10:18.790 に答える