2011-01-26 142 views
0

在WPF窗口上,我有一個簡單的十進制值列表框,它有一個綁定到它的一個ObservableCollection的Amounts,一個綁定到Total屬性的標籤,顯示ListBox下面的值的總和,以及一個TextBox出現在綁定到selectedItem.Amount屬性的ListBox的右側。WPF與ObservableCollection的數據綁定

當我點擊列表框中的一個項目時,我希望能夠編輯被填充的文本框中的selectedItem的值,關閉文本框,並讓listBoxItem更新其值,並且我希望總和得到更新在標籤中也是如此。

我知道如何元素與元素綁定工作(即列表框到文本框) 什麼我有麻煩搞清楚是元素與對象綁定(即ListBox中/的ObservableCollection的總資產)

謝謝非常!

這裏有兩個簡單的類我到目前爲止有:

Public Class TransactionModel 
Implements INotifyPropertyChanged 
'Public Property Amount As Decimal 
Private _amount As Decimal 
Public Property Amount As Decimal 
    Get 
     Return _amount 
    End Get 
    Set(ByVal value As Decimal) 
     _amount = value 
     OnPropertyChanged(New PropertyChangedEventArgs("Amount")) 
    End Set 
End Property 

Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs) 
    If Not e Is Nothing Then 
     RaiseEvent PropertyChanged(Me, e) 
    End If 
End Sub 

末級

公共類視圖模型 實現INotifyPropertyChanged

Private oc As ObservableCollection(Of TransactionModel) 
Sub New() 
    oc = New ObservableCollection(Of TransactionModel) 
    oc.Add(New TransactionModel With {.Amount = 10.0}) 
    oc.Add(New TransactionModel With {.Amount = 20.0}) 
    oc.Add(New TransactionModel With {.Amount = 30.0}) 
    oc.Add(New TransactionModel With {.Amount = 40.0}) 
End Sub 

Public Function GetAmounts() As ObservableCollection(Of TransactionModel) 
    Return oc 
End Function 

Private _total As Decimal = 0.0 
Public Property Total As Decimal 
    Get 
     For Each o In oc 
      _total += o.Amount 
     Next 
     Return _total 
    End Get 
    Set(ByVal value As Decimal) 
     _total = value 
     OnPropertyChanged(New PropertyChangedEventArgs("Total")) 
    End Set 
End Property 

Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs) 
    If Not e Is Nothing Then 
     RaiseEvent PropertyChanged(Me, e) 
    End If 
End Sub 

末級

回答

2

第一部分是添加一個TextBox,並將它綁定到ListBox上的SelectedItem屬性。這將導致文本框來顯示所選項目的數量,並允許用戶更新它的值:

<TextBox DataContext="{Binding ElementName=lb1, Path=SelectedItem}" 
    Text="{Binding Path=Amount}" /> 

然後,您將需要一個名爲總金額在視圖模型的屬性,並綁定到它的價值一個TextBlock。你還必須處理的PropertyChanged的「價值」,並重新引發該事件的「總金額」,這將導致視圖刷新:

<TextBlock Text="{Binding Path=TotalAmount}"></TextBlock> 

和事件處理程序:

Public Class ViewModel Implements INotifyPropertyChanged 
    ... 
    Public Sub New() 
     items = New ObservableCollection(Of TransactionModel)() 
     Dim tm As New TransactionModel() 
     tm.PropertyChanged += New PropertyChangedEventHandler(TransactionModel_PropertyChanged) 
     items.Add(tm) 
     tm = New TransactionModel() 
     tm.PropertyChanged += New PropertyChangedEventHandler(TransactionModel_PropertyChanged) 
     items.Add(tm) 
     tm = New TransactionModel() 
     tm.PropertyChanged += New PropertyChangedEventHandler(TransactionModel_PropertyChanged) 
     items.Add(tm) 
    End Sub 

    Private Sub TransactionModel_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) 
     If e.PropertyName = "Amount" Then 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("TotalAmount")) 
     End If 
    End Sub 
    ... 
End Class 
0

你可能想做的是b IND你的文本框和您的標籤列表框

這裏的SelectedItem屬性是一些XAML來告訴你我是什麼意思....

<StackPanel> 
    <TextBlock Width="248" Height="24" Text="Colors:" TextWrapping="Wrap"/> 
    <ListBox x:Name="lbColor" Width="248" Height="56"> 
     <ListBoxItem Content="Blue"/> 
     <ListBoxItem Content="Green"/> 
     <ListBoxItem Content="Yellow"/> 
     <ListBoxItem Content="Red"/> 
     <ListBoxItem Content="Purple"/> 
     <ListBoxItem Content="Orange"/> 
    </ListBox> 
    <TextBlock Width="248" Height="24" Text="You selected color:" /> 
    <TextBlock Width="248" Height="24" Text={Binding ElementName="lbColor"}/> 
</StackPanel> 

,讓您的標籤值的總和,你可以使用轉換器並直接綁定到集合。

+0

的listboxitems是十進制值,我希望標籤是列表框中值的總和。 – 2011-01-26 23:37:19