2012-09-28 31 views
0

我有一個集合,我在ListView中表示它,並且它由具有擴展器的OrderID分組。在分組時將數據持久化到集合

在Expander Header中,我顯示OrderID以及發票文本框。 在實際的ListView.View中,我顯示了CustomerName,OrderID和一個Invoice TextBox。 因此,每行數據都有自己的發票文本框,每個分組標題都有一個發票文本框。

當我將一個值輸入到組頭文件發票文本框中時,它會自動更新它的成員發票文本框。但是單個行不會更新分組發票文本框。

Screenshot

由於可以從圖像中可以看出(這說明它好多了)

現在當上了「過程所選項目」按鈕,用戶點擊我希望能夠有集合更新與文本框中的InvoiceID。所以不知何故,我需要將分組的行連接到集合以及GroupHeader行。 這可能嗎?

下面是代碼: WPF

<UserControl x:Class="TestGrouping.MainWindowView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="350" Width="525" 
    xmlns:cal="http://www.caliburnproject.org"> 

<UserControl.Resources> 
    <CollectionViewSource x:Key='src' Source="{Binding NewOrders}"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="OrderID" /> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
    <CollectionViewSource x:Key="OrderGroup" Source="{Binding Path=NewOrders}" /> 

    <Style x:Key="CustomListViewItemStyle" TargetType="{x:Type ListViewItem}"> 
     <Style.Triggers> 
      <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
       <Setter Property="Background" Value="#f6f2f2"></Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" ShowGridLines="False" > 


    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 

    </Grid.RowDefinitions> 
    <Button Grid.Column="0" Grid.Row="0" x:Name="ProcessItems" Content="Process Selected Items" HorizontalAlignment="Left" MinWidth="80" cal:Message.Attach="ProcessItems($datacontext)"/> 

    <ListView ItemsSource="{Binding Source={StaticResource src}}" BorderThickness="1" Grid.Column="0" Grid.Row="1" Height="580"> 
     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Margin" Value="0,0,0,5"/> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander IsExpanded="{Binding Mode=TwoWay, Path=IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem, Mode=FindAncestor}}" BorderBrush="#FFA4B97F" BorderThickness="1,1,1,1" > 
             <Expander.Header> 
              <DockPanel> 
               <TextBlock FontWeight="Bold" Text="OrderID : " Margin="5,0,0,0" /> 
               <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100"/> 
               <TextBlock FontWeight="Bold" Text="Count : " Margin="5,0,0,0" /> 
               <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}" Margin="5,0,0,0" Width="100"/> 
               <TextBlock FontWeight="Bold" Text="InvoiceID : " Margin="5,0,0,0" /> 
               <TextBox x:Name="GroupInvoiceID" Margin="5,0,0,0" Width="100" BorderThickness="1" BorderBrush="#FFA4C5E8" /> 
              </DockPanel> 
             </Expander.Header> 
             <Expander.Content> 
              <ItemsPresenter /> 
             </Expander.Content> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </ListView.GroupStyle> 

     <ListView.View> 
      <GridView AllowsColumnReorder="False" x:Name="GridView1"> 
       <GridViewColumn Header="Customer Name" DisplayMemberBinding="{Binding Path=Customer}" ></GridViewColumn> 
       <GridViewColumn Header="Order ID" DisplayMemberBinding="{Binding Path=OrderID}" ></GridViewColumn> 
       <GridViewColumn Header="Invoice ID"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox x:Name="InvoiceID" HorizontalAlignment="Stretch" Width="100" Text="{Binding ElementName=GroupInvoiceID, Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="1" BorderBrush="#FFA4C5E8" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

      </GridView> 
     </ListView.View> 

    </ListView> 


</Grid> 

這裏是代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Caliburn.Micro; 
using System.Collections.ObjectModel; 
using System.Windows; 

namespace TestGrouping 
{ 
public class MainWindowViewModel : Conductor<object> 
{ 

    public MainWindowViewModel() { 

     List<OrderViewModel> all = new List<OrderViewModel>(); 
     OrderViewModel ovm = new OrderViewModel(); 
     ovm.ID = 1; 
     ovm.Customer = "cust1"; 
     ovm.OrderID = "0001"; 
     all.Add(ovm); 
     ovm = new OrderViewModel(); 
     ovm.ID = 2; 
     ovm.Customer = "cust2"; 
     ovm.OrderID = "0001"; 
     all.Add(ovm); 
     ovm = new OrderViewModel(); 
     ovm.ID = 3; 
     ovm.Customer = "cust3"; 
     ovm.OrderID = "0002"; 
     all.Add(ovm); 
     ovm = new OrderViewModel(); 
     ovm.ID = 4; 
     ovm.Customer = "cust3"; 
     ovm.OrderID = "0003"; 
     all.Add(ovm); 

     this.NewOrders = new ObservableCollection<OrderViewModel>(all); 
     this.NotifyOfPropertyChange(() => this.NewOrders); 
    } 

    public ObservableCollection<OrderViewModel> NewOrders { get; private set; } 

    public void ProcessItems(object obj) 
    { 

    } 

} 


public class OrderViewModel 
{ 
    public OrderViewModel() 
    { 

    } 

    int _ID; 
    public int ID 
    { 
     get { return _ID; } 
     set 
     { 
      if (value == _ID) 
       return; 

      _ID = value; 

     } 
    } 

    string _Customer; 
    public string Customer 
    { 
     get { return _Customer; } 
     set 
     { 
      if (value == _Customer) 
       return; 

      _Customer = value; 

     } 
    } 


    string _OrderID; 
    public string OrderID 
    { 
     get { return _OrderID; } 
     set 
     { 
      if (value == _OrderID) 
       return; 

      _OrderID = value; 
     } 
    } 

    string _InvoiceNumber; 
    public string InvoiceNumber 
    { 
     get { return _InvoiceNumber; } 
     set 
     { 
      if (value == _InvoiceNumber) 
       return; 

      _InvoiceNumber = value; 
     } 
    } 

} 

} 

我知道這是很長,但我已經盡力提供儘可能多信息儘可能。 任何幫助將是偉大的,或任何指針在正確的方向。 如果有任何信息我錯過了,大聲呼喊。

回答

0

我設法想出解決辦法 - 未必是最優雅的,但我認爲它的工作原理。

我添加了一個更改事件的項目文本框將更新集合。 所以我現在Listview.View如下:

<ListView.View> 
      <GridView AllowsColumnReorder="False" x:Name="GridView1"> 
       <GridViewColumn Header="Customer Name" DisplayMemberBinding="{Binding Path=Customer}" ></GridViewColumn> 
       <GridViewColumn Header="Order ID" DisplayMemberBinding="{Binding Path=OrderID}" ></GridViewColumn> 
       <GridViewColumn Header="Invoice ID"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox x:Name="InvoiceID" HorizontalAlignment="Stretch" Width="100" Text="{Binding ElementName=GroupInvoiceID, Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="1" BorderBrush="#FFA4C5E8" 
            cal:Message.Attach="[Event TextChanged]=[Action InvoiceID_TextChanged($datacontext, $eventArgs)]" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

      </GridView> 
     </ListView.View> 

我下面的代碼添加到模型視圖

public void InvoiceID_TextChanged(object obj, RoutedEventArgs e) 
    { 
     OrderViewModel ovm = obj as OrderViewModel; 
     string invoiceIDText = (e.OriginalSource as TextBox).Text; 
     foreach (OrderViewModel o in NewOrders) 
     { 
      if (o.ID == ovm.ID) 
      { 
       o.InvoiceNumber = invoiceIDText; 
      } 
     } 
    } 

這將更新集合「NewOrders」用正確的InvoiceNumber。一旦「流程項目」按鈕被點擊,集合已經被更新,現在可以被保存到數據庫中。

我希望這可以幫助別人。