これは少し長いですが、この作業にはスタイル セレクターを使用します。
例として、次のウィンドウでデータ グリッドをセットアップしました。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<local:RowStyleSelector x:Key="styleSelector"/>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Items}" RowStyleSelector="{StaticResource styleSelector}"/>
</Grid>
</Window>
スタイル セレクターは、以下のコード ビハインドで定義されています。TestClass は、グリッドに配置するオブジェクトを表すことに注意してください。
RowStyleSelector クラスでは、グリッドに行が追加されるたびに SelectStyle メソッドが 1 回実行されます。
public partial class MainWindow : Window
{
public ObservableCollection<TestClass> Items
{
get { return (ObservableCollection<TestClass>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<TestClass>), typeof(MainWindow), new PropertyMetadata(null));
public MainWindow()
{
InitializeComponent();
Items = new ObservableCollection<TestClass>();
for (int i = 0; i < 100; i++)
Items.Add(new TestClass()
{
ID = i,
Text = "Text for row " + i.ToString()
});
}
}
public class RowStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
TestClass targetIem = item as TestClass;
if (targetIem != null)
{
// You can work with your data here.
if (targetIem.ID == 0)
{
// Locate and return the style for when ID = 0.
return (Style)Application.Current.FindResource("ResourceName");
}
else
return base.SelectStyle(item, container);
}
else
return base.SelectStyle(item, container);
}
}
public class TestClass
{
public int ID { get; set; }
public string Text { get; set; }
}
編集: 以下のコメントに対応して、改訂された RowStyleConverter を参照してください。TestClass は必要ありません。
public class RowStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
System.Data.DataRow targetItem = item as System.Data.DataRow;
if (targetItem != null)
{
// You can work with your data here.
if ((int)targetItem["IDColumn"] == 0)
{
// Locate and return the style for when ID = 0.
return (Style)Application.Current.FindResource("ResourceName");
}
else
return base.SelectStyle(item, container);
}
else
return base.SelectStyle(item, container);
}
}