【发布时间】:2011-08-14 22:22:26
【问题描述】:
我已经为此寻找答案将近一周了,但我似乎无法找到解决方法。我认为这是一件相对简单的事情......
我有一个 ListView,一个 GridViewColumn 包含 TextBox 项。我想在 ListView 正下方放置一个标签,并用所有 TextBoxes 中的项目总和填充它。每当有人更改任何文本框中的值时,总和也应该更改。
我知道我需要使用转换器来获取总和...但我不知道如何正确绑定...
任何帮助将不胜感激!
编辑:我最终以稍微不同的方式解决了这个问题。我将在下面发布我的解决方案。
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="myParties" XPath="Parties" Source="XMLFile1.xml" />
<CollectionViewSource x:Key="myCollectionViewSource" Source="{StaticResource myParties}" />
<converters:SumConverter x:Key="mySumConverter" />
</Window.Resources>
<StackPanel>
<Button x:Name="Breakpoint" Click="bpClick" Content="Breakpoint"/>
<ListView x:Name="myListView"
HorizontalAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource myCollectionViewSource},XPath='Party',Mode=TwoWay}">
<ListView.View>
<GridView>
<GridViewColumn Width="100" DisplayMemberBinding="{Binding XPath='@Contact'}" Header="Contact"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath='@Qty'}" Header="Q"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath='@Amount'}" Header="Amt"/>
<GridViewColumn x:Name="tbTot" Header="Tot">
<GridViewColumn.CellTemplate>
<DataTemplate>
<DockPanel>
<TextBox Width="100" Text="{Binding XPath='@Tot'}" />
</DockPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<Label Height="22">
<Label.Content>
<MultiBinding Converter="{StaticResource mySumConverter}">
<Binding ElementName="myListView" Path="Items"/>
<Binding ElementName="myListView" Path="Items.Count"/>
</MultiBinding>
</Label.Content>
</Label>
</StackPanel>
</Window>
XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<Parties>
<Party Contact="Jim Shmekel"
Qty="1"
Amount="55.00"
Tot="55.00"/>
<Party Contact="Shmi Skywalker"
Qty="1"
Amount="20.00"
Tot="20.00"/>
<Party Contact="Jon Ronson"
Qty="1"
Amount="23.00"
Tot="23.00"/>
</Parties>
求和转换器:
Imports System.Collections.ObjectModel
Imports System.Reflection
<ValueConversion(GetType(Object()), GetType(String))>
Public Class SumConverter : Implements System.Windows.Data.IMultiValueConverter
Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
Static lvItems As IList
Static lvItem As Xml.XmlElement
Dim nVal As Double
Convert = 0
lvItems = values(0)
If lvItems Is Nothing Then Exit Function
For Each lvItem In lvItems
'Debug.Print(lvItem.GetAttribute("Tot"))
If Double.TryParse(lvItem.GetAttribute("Tot"), nVal) Then
Convert = Convert + nVal
End If
Next
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetTypes() As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
ConvertBack = Nothing
End Function
End Class
【问题讨论】:
标签: .net wpf vb.net xaml ivalueconverter