将值从单个 DataGrid 中的两个不同绑定源传递到 ValueConverter

Pass values to ValueConverter from two different binding sources in single DataGrid

我想做的是在验证失败时将 DataGridRow 着色为红色。我尝试使用 ValueConverter 这样做,但我不知道如何从多个绑定源传递值。

我有绑定到对象集合的数据网格。然后有一个 DataGridTemplateColumn,里面有ComboBox和Textbox(一次只能看到一个),ComboBox没有绑定集合绑定源。

见代码:

<DataGrid Grid.Row="4" Grid.Column="0" x:Name="DGR_Slots" Grid.ColumnSpan="5" Grid.RowSpan="3" ItemsSource="{Binding ElementName=WND_ItemCraftingWindow, Path=SelectedSchematic.Slots}" AutoGenerateColumns="False" ColumnWidth="*">
    <DataGrid.Resources>
        <classes:ValidationConverter x:Key="ValidationConverter" />
    </DataGrid.Resources>

    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="Background" Value="{Binding Converter={StaticResource ValidationConverter}}" />
        </Style>
    </DataGrid.RowStyle>

    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" Visibility="Collapsed"/>
        <DataGridTextColumn Header="Slot Type" Binding="{Binding SlotType}" />
        <DataGridTextColumn Header="Mat Type" Binding="{Binding MaterialType}" />
        <DataGridTextColumn Header="Count" Binding="{Binding MaterialCount}" />
        <!--<DataGridComboBoxColumn Header="Material" />-->
        <DataGridTemplateColumn Header="Material">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <ComboBox Visibility="Visible"  MouseDoubleClick="MaterialCell_MouseDoubleClick" ItemsSource="{Binding ElementName=WND_ItemCraftingWindow, Path=Materials}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectionChanged="MaterialComboBox_SelectionChanged"/>
                        <TextBox Visibility="Collapsed" MouseDoubleClick="MaterialCell_MouseDoubleClick" PreviewKeyUp="MaterialCell_TextBox_PreviewKeyUp" KeyUp="MaterialCell_TextBox_KeyUp" />
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

WND_ItemCraftingWindow 是拥有数据网格的 Window,材质是 window.

中的 ObservableCollection 属性

我需要将 DataGrid.ItemsSource 集合中的对象(现在有效)和同一行中 Combobox 中的 SelectedItem(我不知道该怎么做)传递到 ValidationConverter。

只能使用来自 DataGridRow 的对象和来自组合框的 SelectedItem 执行行验证。

我也愿意接受不同的解决方案,以便在此类验证后为行着色。

好吧,我设法做到了。

Datagrid代码(去掉无意义部分):

<DataGrid x:Name="DGR_Slots" ItemsSource="{Binding ElementName=WND_ItemCraftingWindow, Path=SelectedSchematic.Slots}" AutoGenerateColumns="False" ColumnWidth="*" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Material">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <ComboBox Visibility="Visible" ItemsSource="{Binding ElementName=WND_ItemCraftingWindow, Path=Materials}" SelectionChanged="MaterialComboBox_SelectionChanged" />
                        <TextBox Visibility="Collapsed" />
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

SelectionChanged 事件

private void MaterialComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // ...

    var slot = (DGR_Slots.SelectedItem as SchematicSlot);
    var mat = ((sender as ComboBox).SelectedItem as Material);
    var row = WPFHelper.GetRow(DGR_Slots, DGR_Slots.SelectedIndex);

    row.Background = new SolidColorBrush(slot.MaterialType != mat.MaterialType ? Colors.Red : Colors.White);
}

WPFHelper GetRow 方法(在 Internet 某处找到)

static public DataGridRow GetRow(DataGrid dg, int index)
{
    DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);

    if (row == null)
    {
        // may be virtualized, bring into view and try again
        dg.ScrollIntoView(dg.Items[index]);
        row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
    }

    return row;
}

虽然我仍然对其他解决方案持开放态度。