ListView で表すコレクションがあり、Expander を使用して OrderID でグループ化されています。
Expander ヘッダーに、OrderID と Invoice TextBox を表示します。実際の ListView.View では、CustomerName、OrderID、Invoice TextBox を表示します。したがって、データの各行には独自の Invoice TextBox があり、各 Grouping ヘッダーには Invoice TextBox がありました。
グループ ヘッダーの請求書テキスト ボックスに値を入力すると、メンバーの請求書テキスト ボックスが自動的に更新されます。ただし、個々の行は Grouping Invoice TextBox を更新しません。
画像からわかるように(これはそれをよりよく説明しています)
ユーザーが [選択したアイテムの処理] ボタンをクリックすると、TextBox の InvoiceID でコレクションを更新できるようにしたいと考えています。したがって、グループ化された行を Collection と 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;
}
}
}
}
これがかなり長いことは承知していますが、できるだけ多くの情報を提供しようとしました。どんな助けも素晴らしいでしょう、または正しい方向への指針。そして、私が見逃した情報があれば叫んでください。