1

以下の点について、少しお力添えをいただければ幸いです。私のビューモデルには以下が含まれています:

  • すべてのジョブのリスト
  • グループ化されたすべてのジョブのリスト (例: 特定のカテゴリのジョブ)
  • 現在選択されているグループ内のすべてのジョブのリスト。

これは、ビューでは 3 つの個別のデータグリッドとして表現されます。

  • すべてのジョブを表示する 1 つ
  • グループ化されたすべてのジョブを表示する 1 つ
  • 1 つは、現在選択されているグループ内のすべてのジョブを表示します。

グループ ジョブ ビューで選択したグループに基づいて、現在のグループ内のジョブのリストを変更できる現在のバインディングを使用できます。

私が支援を求めているのは、ジョブが現在選択されているジョブ グループ リストにあるかどうかに基づいて、メイン ジョブ リストの行の背景色を変更するようにバインドすることです。

したがって、現在のジョブのグループを変更すると、そのグループに含まれるすべてのジョブが強調表示されます。任意の支援をいただければ幸いです。

4

1 に答える 1

2

DataGridスタイルとMultiBindingトリガーとコンバーターを組み合わせることでこれを解決します。

サンプル XAML コード:

<Window.Resources>
    <this:RowConverter x:Key="RowConverter" />
</Window.Resources>

<Grid>
    <DataGrid Name="dtGroups" HorizontalAlignment="Left" />

    <DataGrid Name="dtJobs" HorizontalAlignment="Right">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Value="True">
                        <DataTrigger.Binding>
                            <MultiBinding Converter="{StaticResource RowConverter}">
                                <Binding Path="SelectedItem.Id" ElementName="dtGroups" />
                                <Binding Path="GroupId" />
                            </MultiBinding>
                        </DataTrigger.Binding>

                        <Setter Property="Background" Value="Green" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
</Grid>

dtGroupsタイプのオブジェクトでDataGrid満たされています:

public class JobGroup
{
    public int Id { get; set; }
    public string Name { get; set; }
}

dtJobsタイプのオブジェクトでDataGrid満たされています:

public class Job
{
    public string Name { get; set; }
    public int GroupId { get; set; }
}

次に、GroupIdin Jobclass が で選択したジョブ グループと同じかどうかを確認しdtGroupsます。それはコンバーターで起こります:

class RowConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.Length != 2 || values[0] == null || values[1] == null) return false;

        if (values[0].ToString() == values[1].ToString()) return true;

        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-05-22T20:20:53.587 に答える