0

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;
        }
    }

}

}

これがかなり長いことは承知していますが、できるだけ多くの情報を提供しようとしました。どんな助けも素晴らしいでしょう、または正しい方向への指針。そして、私が見逃した情報があれば叫んでください。

4

1 に答える 1

0

私はこれを理解することができました-最もエレガントではないかもしれませんが、うまくいくと思います.

コレクションを更新する項目 TextBox に Change イベントを追加しました。したがって、私の 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>

そして、次のコードを ModelView に追加しました

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 で更新されます。[アイテムの処理] ボタンをクリックすると、コレクションが更新され、データベースに永続化できるようになります。

これが誰かに役立つことを願っています。

于 2012-10-01T09:55:10.150 に答える