1

我有一个ListView,其DataTemplate 由 aComboBox和一些TextBoxes 组成。ComboBox绑定到映射到 CollectionViewSource 的 Collection 。可以有任意数量的ListView行。

问题是在一个项目中选择一个项目ComboBox会改变它们。我确实希望它们都填充相同的内容,但能够独立设置。

资源部分包含以下内容:

    <CollectionViewSource Source="{Binding ChildAccounts}" x:Key="ChildGroupedData">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="group"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <!-- Template for each child item in ListView -->
    <DataTemplate x:Key="ChildTemplate">
        <Grid>
            <Grid.ColumnDefinitions>                    
                <ColumnDefinition Width="90"/>
                <ColumnDefinition Width="130"/>
                <ColumnDefinition Width="90"/>
                <ColumnDefinition Width="90"/>
                <ColumnDefinition Width="90"/>
                <ColumnDefinition Width="210"/>
            </Grid.ColumnDefinitions>                
            <Label Grid.Column="0" Content="Account" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{StaticResource CustomWhite}" FontSize="14" Width="80"/>
            <ComboBox Grid.Column="1" SelectedValue="{Binding Path=accFrom}" ItemsSource="{Binding Source={StaticResource ChildGroupedData}}" ItemTemplate="{StaticResource AccountTemplate}" SelectedValuePath="ID" Width="120" Style="{StaticResource RoundedComboBox}" HorizontalAlignment="Left" VerticalAlignment="Center">
                <ComboBox.GroupStyle>
                    <GroupStyle ContainerStyle="{StaticResource CustomExpanderComboGroupItemStyle}" HeaderTemplate="{StaticResource GroupHeader}"/>
                </ComboBox.GroupStyle>
            </ComboBox>
            <Label Grid.Column="2" Content="Amount" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{StaticResource CustomWhite}" FontSize="14" Width="80"/>
            <TextBox Grid.Column="3" Text="{Binding Path=amount, StringFormat='#,##0.00'}" Style="{StaticResource RoundedTextBox}" Width="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
            <Label Grid.Column="4" Content="Comment" HorizontalAlignment="Left" VerticalAlignment="Top" Foreground="{StaticResource CustomWhite}" FontSize="14" Width="80"/>
            <TextBox Grid.Column="5" Text="{Binding Path=comment}" Style="{StaticResource RoundedTextBox}" Width="200" HorizontalAlignment="Left" VerticalAlignment="Center"/>
        </Grid>
    </DataTemplate>

    <!-- ListView template -->
    <Style x:Key="ChildListViewStyle" TargetType="{x:Type ListView}">
        <Setter Property="ItemTemplate" Value="{DynamicResource ChildTemplate}"/>
        <Setter Property="Background" Value="{StaticResource CustomBackground}"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Margin" Value="10,10,10,10"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <Setter Property="Padding" Value="0,0,50,0"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Style.Resources>
            <!-- Makes selection invisible when focus lost -->
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{StaticResource CustomBackgroundC}"/>
        </Style.Resources>
    </Style>

ListView定义为:

<ListView Grid.Column="0" x:Name="lstChildren" Margin="20,30,0,0" ItemsSource="{Binding Path=Items}" Style="{StaticResource ChildListViewStyle}"/>

编辑:

在关联类中找到以下内容

Imports System.Data
Imports System.Data.OleDb
Imports System.Collections.ObjectModel
Imports System.ComponentModel

Class ItemView
Implements INotifyPropertyChanged

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Private Sub NotifyPropertyChanged(ByVal info As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub

....

Private _ChildAccounts As ObservableCollection(Of AccountEntry)
Public Property ChildAccounts As ObservableCollection(Of AccountEntry)
    Get
        Return _ChildAccounts
    End Get
    Set(value As ObservableCollection(Of AccountEntry))
        _ChildAccounts = value
    End Set
End Property

....

Private Sub ItemView_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized

    Dim dsacmd As OleDbDataAdapter
    Dim dsa As New DataSet
    Dim dva As DataView
    Dim strSelect As String

    Try
        ' ** Open a connection to the database.        
        cn = New OleDbConnection(strConnection)
        cn.Open()

        Me.DataContext = Me

        strSelect = "SELECT Accounts.ID, Accounts.deleted, Accounts.accType, Accounts.currency as curr, IIf([Currencies.ID]=1,Accounts.comment,Accounts.comment & "" ("" & Currencies.symbol & "")"") AS comment, Currencies.comment AS currS FROM Currencies INNER JOIN Accounts ON Currencies.ID = Accounts.currency"
        dsacmd = New OleDbDataAdapter(strSelect, cn)
        dsacmd.Fill(dsa, "Accounts")
        dva = New DataView(dsa.Tables("Accounts"))
        dva.RowFilter = "accType=" & cVirtual.ToString & " AND deleted=False"
        dva.Sort = "curr, comment"
        ChildAccounts = New ObservableCollection(Of AccountEntry)(dva.ToTable.AsEnumerable().[Select](Function(i) New [AccountEntry](i("ID"), i("currS").TrimEnd(" "), i("comment"))))

....

Private Sub DisplayItem()

    ....

            strSelect = ""
            Dim Relations As Collection(Of Relation) = GetRelations(ID)
            For Each r As Relation In Relations
                strSelect &= "ID=" & r.ID.ToString & " OR "
            Next
            If strSelect <> "" Then strSelect = "SELECT * FROM Items WHERE " & strSelect.Substring(0, strSelect.Length - 4)
            If strSelect <> "" Then
                dsrcmd = New OleDbDataAdapter(strSelect, cn)
                dsr.Clear()
                dsrcmd.Fill(dsr, "Items")
                lstChildren.DataContext = dsr
            End If
....
4

2 回答 2

0

您将需要将您的移动CollectionViewSourceDataTemplate. 要强制所有组合框项目使用相同的源集合,我认为您可以尝试两件事:

- 使用相对源来选择ChildAccountsfromListViewDataContext

...
<Grid.Resources>
  <CollectionViewSource x:Key="ChildGroupedData"
                        Source="{Binding RelativeSource={RelativeSource FindAncestor,
                                                                        AncestorType={x:Type ListView}},
                                          Path=DataContext.ChildAccounts}">
    <CollectionViewSource.GroupDescriptions>
      <PropertyGroupDescription PropertyName="group" />
    </CollectionViewSource.GroupDescriptions>
  </CollectionViewSource>
</Grid.Resources>
...

更新:

上面的方法可以在我放在一起的这个示例中看到。请注意,ChildAccount 只是ObservableCollection<T>视图模型中的一个,这样我们就没有新的集合,ListBoxItem而是像您在问题中要求的那样共享它们。

如果您的 ChildAccounts 属性实际上就像说每个 ListBoxItem 都有一个 ChildAccounts 属性对象的“评论”属性,只需更改

<CollectionViewSource x:Key="ChildGroupedData"
                        Source="{Binding RelativeSource={RelativeSource FindAncestor,
                                                                        AncestorType={x:Type ListView}},
                                          Path=DataContext.ChildAccounts}">

<CollectionViewSource x:Key="ChildGroupedData"
                        Source="{Binding ChildAccounts}">

它也应该工作。但是,您现在确实有一个 ChildAccounts 集合,ListBoxItem并且没有共享它们的源。

主要是定义CollectionViewSource内部DataTemplate。下载随附的示例并亲自尝试并检查细节。

-ChildAccounts作为静态变量

...
<Grid.Resources>
  <CollectionViewSource x:Key="ChildGroupedData"
                        Source="{x:Static local:ChildAccounts}">
    <CollectionViewSource.GroupDescriptions>
      <PropertyGroupDescription PropertyName="group" />
    </CollectionViewSource.GroupDescriptions>
  </CollectionViewSource>
</Grid.Resources>
...
于 2013-04-29T10:22:32.247 回答
0

您可以将集 IsSynchronizedWithCurrentItem="False" 添加到组合框中。

于 2017-02-22T07:44:04.193 回答