绑定多个数据网格的条件

时间:2013-05-22 14:36:34

标签: wpf binding datagrid

我正在寻求以下方面的一些帮助。我的视图模型包含以下内容:

  • 所有工作的列表
  • 所有分组作业的列表(例如特定类别中的作业)
  • 当前所选组中所有作业的列表。

这在视图中表示为3个单独的数据网格。

  • 一个显示所有工作
  • 一个显示所有分组作业
  • 一个用于显示当前所选组中的所有作业。

当前绑定我允许根据我在组作业视图中选择的组来更改当前组中的作业列表。

我正在寻求帮助的是将主要作业列表的行背景颜色绑定到根据作业是否在当前选定的作业组列表中进行更改。

因此,如果我更改当前的作业组,则该组中的所有作业都将突出显示。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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; }
}

接下来,我检查GroupId类中的Job是否与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();
    }
}