Привязка данных WPF с помощью ObservableCollection - PullRequest
0 голосов
/ 27 января 2011

В окне WPF у меня есть простой список десятичных значений, к которому привязан ObservableCollection of Amounts, метка привязана к свойству Total, которая показывает сумму значений под ListBox, и TextBox ксправа от ListBox, привязанного к свойству selectedItem.Amount.

Когда я щелкаю по элементу в ListBox, я хочу иметь возможность редактировать значение selectedItem в заполняемом текстовом поле, открывать вкладку TextBox ипусть listBoxItem обновит свое значение, и я хочу, чтобы сумма также обновлялась в метке.

Я понимаю, как работает привязка данных от элемента к элементу (т. Е. ListBox to Textbox). У меня возникают проблемы с определением привязки данных от элемента к объекту (т. Е. ListBox / ObservableCollection к свойству Total)

Большое спасибо!

Вот два простых класса, которые у меня есть:

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

Конечный класс

Открытый класс ViewModel Реализует 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 ]

2 голосов
/ 27 января 2011

Первая часть - добавить TextBox и связать его со свойством SelectedItem в ListBox.Это приведет к тому, что TextBox покажет сумму для выбранного элемента и позволит пользователю обновить его значение:

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

Затем вам потребуется свойство ViewModel с именем TotalAmount и TextBlock, привязанный к его значению.,Вам также придется обработать PropertyChanged для «Value» и повторно вызвать событие для «TotalAmount», что приведет к обновлению представления:

<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 голосов
/ 27 января 2011

то, что вы, вероятно, хотите сделать, - это связать ваш TextBox и ваш ярлык со свойством SelectedItem ListBox

, вот какой-то 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>

чтобы сделать ваш ярлык суммой значений, вы можете использовать конвертер и привязать его непосредственно к коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...