当行仍在编辑时,如何在从DataGridComboBoxColumn中选择后更新其他列?

时间:2014-06-02 09:08:59

标签: c# wpf mvvm datagrid

我正在寻找解决方案已经有一段时间没有运气了,希望我能在这里得到专家的帮助。

例如,我有一个Product类:

public class ProductModel : ObservableObject
{
    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; OnPropertyChanged("Id"); }
    }

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }

    private decimal unitPrice;
    public decimal UnitPrice
    {
        get { return unitPrice; }
        set { unitPrice = value; OnPropertyChanged("UnitPrice"); }
    }
}

我有另一个名为Order的课程:

public class Order : ObservableObject
{
    SportsEntities db;

    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; OnPropertyChanged("Id"); }
    }

    private int productId;
    public int ProductId
    {
        get { return productId; }
        set
        {
            productId = value;
            UnitPrice = db.Products.First(x => x.Id == value).UnitPrice;
            OnPropertyChanged("ProductId");
            OnPropertyChanged("UnitPrice");
        }
    }

    private decimal unitPrice;
    public decimal UnitPrice
    {
        get { return unitPrice; }
        set { unitPrice = value; OnPropertyChanged("UnitPrice"); }
    }

    public Order()
    {
        db = new SportsEntities();
    }
}

在View中,我将ObservableCollection从ViewModel绑定到带有2列的DataGrid - " Product"和"单价"。 '产品' column是DataSridComboBoxColumn,ItemsSource绑定到ObservableCollection。

我可以选择产品并在完成行编辑后获得单价。但是,我真正想要的是在我仍在更新行时选择产品后立即更新单价列。

有人可以提供建议吗?谢谢。

增加:

查看

        <DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Width="120" Header="Product" SelectedValueBinding="                  {Binding ProductId}"
                                        DisplayMemberPath="Name" SelectedValuePath="Id">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding DataContext.Products, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding DataContext.Products, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
                <DataGridTextColumn Width="80" Header="Unit Price" Binding="{Binding UnitPrice}" />
            </DataGrid.Columns>
        </DataGrid>

视图模型

public class MainViewModel : ViewModelBase
{
    private SportsEntities db;

    private ObservableCollection<ProductModel> products;
    public ObservableCollection<ProductModel> Products
    {
        get { return products; }
        set { products = value; OnPropertyChanged("Products"); }
    }

    private ObservableCollection<Order> orders;
    public ObservableCollection<Order> Orders
    {
        get { return orders; }
        set { orders = value; OnPropertyChanged("Orders"); }
    }

    public MainViewModel()
    {
        Initialized();
    }

    private void Initialized()
    {
        db = new SportsEntities();
        Products = new ObservableCollection<ProductModel>();

        foreach (Product p in db.Products)
        {
            Products.Add(new ProductModel { Id = p.Id, Name = p.Name, UnitPrice = p.UnitPrice });
        }

        Orders = new ObservableCollection<Order>();
    }
}

0 个答案:

没有答案
相关问题