0

これは私の最初の投稿です - 必要に応じて質問を投稿する方法についてのアドバイスを歓迎します。

OrderDetails(List Of OrderDetails) というプロパティにバインドされ、CurrentOrderDetail というプロパティ にバインドされた WPFDataGridがあります。ItemsSourceSelectedItem

CurrentOrderDetail プロパティ内で、計算を行うメソッドを呼び出します。計算を行うメソッドは、OrderDetails プロパティをループ処理し、そのリストに属する各 OrderDetail の 2 つのメンバーを乗算して合計コストを生成します。このメソッドは、フォーム上でテキスト ボックスがバインドされている別のプロパティを更新するだけです。

の最後の行に到達するまで、これはすべてうまく機能しDataGridます。基本的に、ユーザーは最初の行から開始し、[請求済み] フィールドをクリックして数量を入力し、Enter キーを押して次の行を選択します。SelectedItem変更により CurrentOrderDetail が更新され、計算が呼び出されます。これはうまくいきます!DataGridユーザーは、最後のレコードがヒットするまで、すべての計算が OK であるプロセスを繰り返します。Invoiced セルの編集を終了するためにユーザーが Enter キーを押すと、calculate メソッドは呼び出されSelectedItemません。

私は標準が好きで、最近 WPF/Silverlight と MVVM に移行して以来、振り返っていません。そういうわけで、私はこのアプリを同じように維持しようとしています。

変更をトリガーするには、何かを強制する必要があると思いSelectedItemます。ビューのイベントにフックして、単にナビゲートを強制することを考えましたが、それは私には少し醜いようです。もっと良い解決策があるはずです。私はここや他のフォーラムで 2 日間過ごし、自分のアイデアをいくつか試しましたが、どれもうまくいきませんでした。

ユーザーに別の行に移動してプロパティ通知をトリガーするように求めることもできますが、そうはしません。

の XAML は次のDataGridとおりです。

<DataGrid Name="grdData" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" CanUserAddRows="False" Margin="5,5,5,5" ItemsSource="{Binding Path=OrderDetails, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  SelectedItem="{Binding Path=CurrentOrderDetail, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="3" >
    <DataGrid.Columns>   
        <DataGridTextColumn Binding="{Binding Path=Part}" Header="Wyandot Part #" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=SupplierPartNumber}" Header="Supplier Part #" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=UnitPrice, StringFormat=c}" Header="Price" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=Account}" Header="Account" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=UDF5, Mode=TwoWay}" Header="Invoiced" IsReadOnly="False" />
    </DataGrid.Columns>
</DataGrid>

そして、関連する私のView Modelからのスニペット。

Private m_orderDetails As List(Of OrderDetail)
Public Property OrderDetails As List(Of OrderDetail)
    Get
        Return m_orderDetails
    End Get
    Set(value As List(Of OrderDetail))
        m_orderDetails = value
        InvokePropertyChanged("OrderDetails")
    End Set
End Property

Private m_currentOrderDetail As OrderDetail
Public Property CurrentOrderDetail As OrderDetail
    Get
        Return m_currentOrderDetail
    End Get
    Set(value As OrderDetail)
        m_currentOrderDetail = value
        InvokePropertyChanged("CurrentOrderDetail")
        Calculate()
    End Set
End Property

Public Sub Calculate()
    Dim total As Decimal = 0

    For Each detail As OrderDetail In OrderDetails
        total += detail.UnitPrice * detail.UDF5
    Next

    PoTotal = CStr("$" & total.ToString)
End Sub
4

1 に答える 1

0

あなたの計算が間違った変更されたイベントで起こっているように私には聞こえます。ユーザーが更新しているOrderDetailvalueプロパティがプロパティ変更イベントをトリガーし、それを使用して合計を更新します。

それぞれのプロパティ変更イベントをサブスクライブするのはもう少し手間がかかりOrderDetailますが、それはあなたが本当に気にかけていることです。私はおそらくを使用ObservableCollection<OrderDetail>し、Collectionchangedイベントで必要なリスナーを接続します。

于 2013-03-07T17:50:24.613 に答える