5

データグリッドの各行をループし、列の値を取り出し、この値をメソッドに渡し、メソッドの結果に基づいてその行をスタイルしようとしています。

データグリッドの行をループするだけではできないことがわかった後、それがどのように可能であったかを詳述したこの投稿を見つけました。

datarowview オブジェクトを操作するように少し変更しました。

私が今抱えている問題は、

var dgRow = grid.ItemContainerGenerator.ContainerFromItem(r) as DataGridRow;

は常に null を返します。

私の場合になぜこれが起こっているのか、そして彼らがそれを行うより簡単な方法を見ることができるかどうかについて、誰かがアドバイスできますか.

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

私のコードは次のとおりです。

private void colorArchived( DataGrid grid , GX3MaterialSelectionData data)
    {
        var row = GetDataGridRows(grid);
        foreach (DataRowView r in row)
        {
            var dgRow = grid.ItemContainerGenerator.ContainerFromItem(r) as DataGridRow;
            int val = int.Parse(r.Row[0].ToString());
            if ( data.IsArchived(val) )
            {
                // style will be defined in xaml
                dgRow.Style = mystyle;
            }


        }

    }

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

3 に答える 3

1

あなたの質問によると、私は上記のStyleSelectorクラスを更新しました:

public class RowStyle : StyleSelector
{
    public override Style SelectStyle(object item, DependencyObject container)
    {
        var dgRow = item as DataGridRow;
        int val = int.Parse(dgRow.Row[0].ToString());
        if ( data.IsArchived(val) )
        {
            return Mystyle;
        }
        return base.SelectStyle(item, container);
    }

    // style will be defined in xaml
    public Style Mystyle
    {
        get;
        set;
    }
}

注:「GX3MaterialSelectionDatadata」をクラスの静的として記述し、上記のクラスが直接アクセスできるようにします。

于 2012-11-20T12:34:31.950 に答える
0

この場合、StyleSelector を使用できます。

public class RowStyle : StyleSelector
{
    public override Style SelectStyle(object item, DependencyObject container)
    {
        // here the item property is the entity that the grid row is bound to.
        // check whatever values you want on it and locate a matching style with
        // find resource.

        // return a reference to the correct style here

        // or allow this to run if you want the default style.
        return base.SelectStyle(item, container);
    }
}

データ グリッドで使用するには、RowStyleSelector プロパティを設定する必要があります。

<Window x:Class="Rich.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Rich"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:RowStyle x:Key="styleSelector"/>
    </Window.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Items}" RowStyleSelector="{StaticResource styleSelector}">            
            <DataGrid.Columns>
                <DataGridTextColumn Header="test" Binding="{Binding Test1}"/>
                <DataGridTextColumn Header="test2" Binding="{Binding Test2}"/>
                <DataGridTextColumn Header="test3" Binding="{Binding Test3}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
于 2012-11-20T10:27:39.447 に答える