Help me to solve binding problem. The poject is in WPF + WAF + ef code first. I want to bind DataGridComboBoxColumn value to models property, but something not working. Models:
public class DocumentMove
{
[Key]
public Guid DocumentMoveId { get; set; }
public Guid RawMaterialId { get; set; }
public RawMaterial RawMaterial { get; set; }
public decimal Amount { get; set; }
public decimal Price { get; set; }
}
public class RawMaterial
{
[Key]
public Guid RawMaterialId { get; set; }
public RawMaterialGroup Group { get; set; }
[MaxLength(20)]
public string Code { get; set; }
public Colour Colour { get; set; }
[MaxLength(100)]
public string Name { get; set; }
public Measure Measure { get; set; }
public List<ArrLocation> ArrLocations { get; set; }
public List<RawMove> RawMoves { get; set; }
public Delivery Supplier { get; set; }
public RawMaterial()
{
}
}
The grid:
<DataGrid x:Name="documentMoveTable" AutoGenerateColumns="False" ItemsSource="{Binding DocumentMoves}"
SelectedItem="{Binding SelectedDocumentMove}" CanUserDeleteRows="False" IsReadOnly="False" RowEditEnding="documentMoveTable_RowEditEnding">
<DataGrid.InputBindings>
<KeyBinding Command="{Binding RemoveCommand}" Key="Del"/>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridComboBoxColumn Header="{x:Static p:Resources.RawMaterial}"
SelectedValueBinding="{Binding RawMaterialId}"
DisplayMemberPath="Name" SelectedValuePath="RawMaterialId">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RawMaterials}" />
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RawMaterials}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Binding="{Binding Amount, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,
ValidatesOnExceptions=True, NotifyOnValidationError=True}"
Header="{x:Static p:Resources.Amount}" Width="*" ElementStyle="{StaticResource TextCellElementStyle}"/>
<DataGridTextColumn Binding="{Binding Price, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,
ValidatesOnExceptions=True, NotifyOnValidationError=True}"
Header="{x:Static p:Resources.Price}" Width="*" ElementStyle="{StaticResource TextCellElementStyle}"/>
</DataGrid.Columns>
</DataGrid>
And ViewModel:
[Export]
public class EditDocumentViewModel : ViewModel<IEditDocumentView>
{
private IEnumerable<DocumentMove> _documentMoves;
private ICommand _removeCommand;
private ICommand _editListCommand;
public IEnumerable<DocumentMove> DocumentMoves
{
get { return _documentMoves; }
set
{
_documentMoves = value;
RaisePropertyChanged("DocumentMoves");
}
}
public DocumentMove SelectedDocumentMove { get; set; }
...
}
While trying add a new row to grid, I can select a value from ComboBox and add values for "Amount" and "Price". On the Controller's side while handling the EditListCommand the values of _editDocumentViewModel.SelectedDocumentMove.Amount
and _editDocumentViewModel.SelectedDocumentMove.Price
are present but the value of _editDocumentViewModel.SelectedDocumentMove.RawMaterialId
and _editDocumentViewModel.SelectedDocumentMove.RawMaterial
are empty. I think something in my ComboBoxColumn binding is wrong, or may be something else?
I have seen several similar question 1 , 2, but cant find how to fix it.
Please help, and sorry for my english ) .
I added parameter UpdateSourceTrigger=PropertyChanged
to SelectedValueBinding="{Binding RawMaterialId}"
and it working!