2015-07-19 1 views
0

Что я хочу сделать, так это цветной DataGridRow красный, если проверка не удалась. Я попытался сделать это с помощью ValueConverter, но я не знаю, как передать значение из более чем одного источника привязки.Передайте значения ValueConverter из двух разных источников привязки в одиночном DataGrid

У меня есть datagrid с привязкой к коллекции объектов. Затем есть DataGridTemplateColumn с ComboBox и текстовым полем внутри (только один из них виден во время), а 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 это окно, которое владеет DataGrid и материалы является ObservableCollection свойство внутри этого окна.

Мне нужно передать объект из коллекции DataGrid.ItemsSource (которая работает сейчас) и SelectedItem из Combobox в той же строке (я не знаю, как это сделать) в ValidationConverter.

Проверка строки может выполняться только с объектом из DataGridRow и SelectedItem из combobox.

Также я открыт для различных решений для цветной строки после такой проверки.

+0

Ваш подход к проверке данных неверен. Вы должны использовать механизмы проверки, включенные в WPF. Посмотрите на [this] (http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx) сообщение в блоге для получения дополнительной информации. –

+0

Хорошо, что я использую эти правила проверки или IDataErrorInfo, но как я могу использовать их для получения требуемых значений? – user2475983

+0

Используйте 'IMultiValueConverter', если вам нужно отправить несколько значений из привязок xaml. –

ответ

0

Хорошо, мне удалось сделать это хакерским путем.

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 (находится где-то в интернете)

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; 
} 

Хотя я «м все еще открыты для других решений.

Смежные вопросы