簡體   English   中英

WPF-MVVM,主-具有計算列的詳細數據網格。 費率*數量=總計

[英]WPF-MVVM, Master - Detail datagrid with calculated column. Rate * Quantity = Total

我有綁定到viewmodel的數據輸入表單。 我遵循EF代碼優先方法,並且細節表由模型中的可觀察集合表示,如下所示。

public partial class item
{ 
    public item()
    {
        orders = new ObservableCollection<order>();
    }
}

一切正常,但在少數情況下,我有一個主條目,其中有網格形式的詳細信息。 這是xaml部分,它將SelectedItem.Orders綁定到詳細信息網格。

<UserControl x:Class="ABCD.Views.itemView"
    ....
    DataContext="{Binding itemMaster, Source={StaticResource Locator}}"
    Height="Auto" Width="Auto">
    <Grid> 
        <Grid.ColumnDefinitions.... />
        <Grid.RowDefinitions..../>
        <DataGrid AutoGenerateColumns="False" VerticalAlignment="Top" ItemsSource="{Binding items}" SelectedItem="{Binding SelectedItem}" Name="dgitems" HorizontalAlignment="Stretch" RowDetailsVisibilityMode="VisibleWhenSelected" >
             <DataGrid.Columns>
                        <DataGridTextColumn x:Name="ItemNameColumn" Binding="{Binding Path=ItemName}" Header="Item Name" Width="125" />
                        <DataGridTextColumn x:Name="ItemCodeColumn" Binding="{Binding Path=ItemCode}" Header="Item Code" Width="75" />
                        <DataGridTextColumn x:Name="StockColumn" Binding="{Binding Path=StockLevel}" Header="Stock" Width="60" />
             </DataGrid.Columns>
        </DataGrid>
        <Label Grid.Column="3" Grid.Row="0" Margin="3,3,3,3" Content="Item Code"      VerticalAlignment="Center" />
        <TextBox Grid.Column="4" Grid.Row="0" HorizontalAlignment="Left" Margin="3,3,3,3" Name="ctrlItemCode" Text="{Binding Path=SelectedItem.ItemCode, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" Width="120" Height="Auto" VerticalContentAlignment="Center" />
        <Label Grid.Column="3" Grid.Row="2" Margin="3,3,3,3" Content="Product Name" VerticalAlignment="Center" />
        <TextBox Grid.Column="4" Grid.Row="2" HorizontalAlignment="Left" Margin="3,3,3,3" Name="ctrlProductName" Text="{Binding Path=SelectedItem.ItemName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" Width="120" Height="Auto" VerticalContentAlignment="Center" />
        <DataGrid Grid.Column="2" Grid.Row="16" Grid.ColumnSpan="3"  Height="145" AutoGenerateColumns="False" VerticalAlignment="Top" ItemsSource="{Binding SelectedItem.Orders}"  Name="dgOrders" HorizontalAlignment="Stretch" >
             <DataGrid.Columns>
                  <DataGridTemplateColumn Width="120">
                       <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                 <ComboBox DisplayMemberPath="OrderNumber" SelectedValuePath="OrderId"  ItemsSource="{Binding Path=DataContext.Orders,   RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" SelectedValue="{Binding Path=OrderId}" />
                             </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                  </DataGridTemplateColumn>
                  <DataGridTextColumn x:Name="QtyColumn" Binding="{Binding Path=Quantity}" Header="Qty" Width="75" />
                  <DataGridTextColumn x:Name="PriceColumn" Binding="{Binding Path=Price}" Header="Price" Width="75" />
                  <DataGridTextColumn x:Name="TotalColumn" Binding="{Binding Path=Total}" Header="Total" Width="75" />
              </DataGrid.Columns>
        </DataGrid>
   </Grid>
 </UserControl>

在這種情況下,我想在用戶在網格中鍵入價格和數量后立即計算總數。 我知道,如果我們在viewmodel中具有相關屬性,就可以處理它。 但就我而言,訂單是項目模型中的集合。

提前致謝。

好的,在論壇上尋求支持后,我找到了適合我情況的解決方案。 只需將其張貼在這里,對某人有用。

簡要介紹對我有用的最終答案。 可以做的是用視圖模型包裝每個實體。 因此,在那里使用該集合的數據網格將其itermssource綁定到OrderVM的可觀察集合,而不是Order(實體類型)。

然后,您可以將實體的屬性與我的視圖模型中的屬性包裝在一起,並在其中放置任何其他業務邏輯,例如計算,並在其中一個因素發生變化時在計算字段上更改屬性。

根據此建議,我對代碼的以下更改幫助我解決了該問題; 如下所示的OrderVM集合;

 public class OrderVM : baseViewModel
{
    public OrderVM()
    {   }
    private order _order;
    public order Order
    {
        get
        {
            return _order;
        }
        set
        {
            _order = value;
            NotifyPropertyChanged();
        }
    }
public decimal Percentage
    {
        get
        {
            return (decimal)_order.Percentage; //Without passing the selectedOrder.Percentage like this, It doesn't work
        }
        set
        {
            _order.Percentage = value;
            NotifyPropertyChanged();
            calculate();
        }
    }
    public decimal Qty
    {
        get
        {
            return (decimal)_order.Qty;
        }
        set
        {
            _order.Qty = value;
            NotifyPropertyChanged();
            calculate();
        }
    }
    public decimal Total
    {
        get
        {
            return (decimal)_order.Total;
        }
        set
        {
            _order.Total = value;
            NotifyPropertyChanged();
        }
    }
    private void calculate()
    {
        _order.Total = _order.Price * _order.Qty;
        NotifyPropertyChanged("Total");
    }
 }

itemVM(MainVM)現在具有以下三個重要屬性,即Orders = OrderVM的ObservableCollection OrderVM SelectedItem //選擇進行編輯的項目SelectedOrder //選擇進行編輯的訂單

public class itemsVM : baseViewModel
{
    private item _selectedItem;
    private ObservableCollection<OrderVM> _orders;
    public ObservableCollection<OrderVM> Orders
    {
        get
        {
            if (SelectedItem != null)
            {
                _orders = new ObservableCollection<OrderVM>();
                foreach (Order ord in SelectedItem.Orders)
                {
                    _orders.Add(new OrderVM { Order = ord });
                }
                return _orders;
            }
            else
                return null;
        }
        set { _orders = value; }
    }

// SelectedItem屬性public item SelectedItem {get {return _selectedItem; }設置{_selectedItem =值; NotifyPropertyChanged(); NotifyPropertyChanged(“ CanModify”); NotifyPropertyChanged(“ Orders”); }}

private OrderVM _selectedorder;
    public OrderVM SelectedOrder
    {
        get
        {
            return _selectedorder;
        }
        set
        {
            _selectedorder = value;
            NotifyPropertyChanged();
        }
    }
}

而我的xaml如下:

<DataGrid Grid.Column="2" Grid.Row="16" Grid.ColumnSpan="3"  Height="145" AutoGenerateColumns="False" VerticalAlignment="Top" 
      ItemsSource="{Binding Orders}" SelectedItem="{Binding SelectedOrder}" Name="dgOrders" HorizontalAlignment="Stretch" >
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="QtyColumn" Binding="{Binding Path=Qty}" Header="Qty" Width="75" />
        <DataGridTextColumn x:Name="PriceColumn" Binding="{Binding Path=Price}" Header="Price" Width="75" />
        <DataGridTextColumn x:Name="TotalColumn" Binding="{Binding Path=Total}" Header="Price" Width="75" />
    </DataGrid.Columns>
</DataGrid>

整個對話可以在MSDN論壇上的“ 對話”中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM