将WPF DataGridComboBoxColumn绑定到MVVM(WAF)

时间:2012-11-08 05:47:02

标签: c# wpf data-binding datagridcomboboxcolumn

帮我解决绑定问题。该项目首先使用WPF + WAF + ef代码。我想将DataGridComboBoxColumn值绑定到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()
        {            
        }
}

网格:

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

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

...

}

在尝试向网格添加新行时,我可以从ComboBox中选择一个值,并为“Amount”和“Price”添加值。在Controller处理EditListCommand时,_editDocumentViewModel.SelectedDocumentMove.Amount_editDocumentViewModel.SelectedDocumentMove.Price的值存在,但_editDocumentViewModel.SelectedDocumentMove.RawMaterialId_editDocumentViewModel.SelectedDocumentMove.RawMaterial的值为空。我认为我的ComboBoxColumn绑定中的某些内容是错误的,或者可能是其他内容?

我见过几个类似的问题12,但是  无法找到解决方法。

请帮助,对不起我的英语。)

1 个答案:

答案 0 :(得分:1)

我将参数UpdateSourceTrigger=PropertyChanged添加到SelectedValueBinding="{Binding RawMaterialId}"并且它正常工作!