0

ソースとしてデータテーブルを持つ WPF データグリッドがあります。データグリッドには、rowID を含む非表示の列が含まれています。私ができる必要があるのは、datagird の各行を反復処理し、rowID を取り出して、これをbool IsArchived( int rowID )メソッドに渡すことです。このメソッドが true を返す場合、何らかの方法でデータグリッド行のスタイルを設定したいと思います。

ここで見つけたメソッドを実装しようとしました

private void colorArchived( DataGrid grid , GX3MaterialSelectionData data)
        {
            var rows = GetDataGridRows(grid);

            foreach (DataGridRow row in rows)
            {
                DataRowView rv = (DataRowView)row.Item;
                int rowID = (int)rv.Row[1];
                data.IsArchived( rowID );

            }
        }

        public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
        {
            var itemsSource = grid.ItemsSource as IEnumerable;
            if (null == itemsSource) yield return null;
            foreach (var item in itemsSource)
            {
                var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
                if (null != row) yield return row;
            }
        }

しかし、行var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;は常にnullを返しています。

可能な限りプログラムでこれを行いたいと思います。

さらに情報が必要な場合はお知らせください。

4

1 に答える 1

1

これは少し長いですが、この作業にはスタイル セレクターを使用します。

例として、次のウィンドウでデータ グリッドをセットアップしました。

<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);            
    }
}
于 2012-11-13T14:34:17.147 に答える