質問

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!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top