0

現在のセットアップ

次のインターフェイスに準拠した、インストーラー ファイルとそのファイルに関するいくつかのプロパティを表すカスタム クラスがあります。

public interface IInstallerObject
{
    string FileName { get; set; }
    string FileExtension { get; set; }
    string Path { get; set; }
    int Build { get; set; }
    ProductType ProductType { get; set; }
    Architecture ArchType { get; set; }
    bool Configurable { get; set; }
    int AverageInstallTime { get; set; }
    bool IsSelected { get; set; }
}

MyViewModelには というReadOnlyObservableCollection<IInstallerObject>名前のプロパティがありますAvailableInstallerObjects

MyViewには、前述のプロパティにバインドする をGroupBox含む があります。ItemsControl

    <GroupBox Header="Products">
        <ItemsControl ItemsSource="{Binding Path=AvailableInstallerObjects}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=IsSelected}"
                                  VerticalAlignment="Center" Margin="5"/>
                        <TextBlock Text="{Binding Path=FileName}" Margin="5" />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </GroupBox>

ユーザーフレンドリーではないことを除けば、バインディングは正しく機能します。100以上のアイテムが表示されます。

ここで助けが必要

のコレクションを使用できるようにしたいIInstallerObjectのですが、次の構造Viewでそれらを提示してください。ItemTemplate

    <GroupBox Header="Products">
        <ItemsControl ItemsSource="{Binding Path=AvailableInstallerObjects}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=IsSelected}"
                                  VerticalAlignment="Center" Margin="5"/>
                        <TextBlock Text="{Binding Path=ProductType}" Margin="5" />
                        <ComboBox ItemsSource="{Binding Path=Build}" />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </GroupBox>

ProductType基本的に、プロパティごとにグループ化して、利用可能な製品のリストを表示し、 の の利用可能なプロパティ値をComboBox表すようにしたいと考えています。BuildIInstallerObjectProductType

で使用LINQViewModelてグループを抽出できますが、抽出したものにどのようにバインドするかわかりません。

私の調査では、 を使用する可能性も判明しましたCollectionViewSourceが、それを現在のセットアップにどのように適用できるかはわかりません。

よろしくお願いします。私は学びたいと思っているので、明らかなことを見落としている場合は、その情報を教えてください。喜んで自分自身を教育します.

4

3 に答える 3

0

ビューでaを宣言し、CollectionViewSourceそれをにバインドするだけObservableCollectionです。GroupDescriptionsこのオブジェクト内で、ソースをいくつかのグループに分割する1つ以上を宣言します。

このソースをリストボックスにバインドし、グループの説明用のテンプレートを作成すれば完了です。

例はここにあります:WPFサンプルシリーズ–リストボックスのグループ化、並べ替え、小計、折りたたみ可能な領域。CollectionViewSourceの詳細については、WPFのCollectionViewSourceを参照してください。

于 2012-07-27T20:34:13.457 に答える
0

あなたの問題の説明から、ある種の折りたたみ/展開/グループ化/ツリービューのようなものを探していると思います。

ツリー ビューの XAML

<Window x:Class="WPFLab12.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:loc="clr-namespace:WPFLab12"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      <GroupBox Header="Products">
        <TreeView ItemsSource="{Binding Path=ProductTypes}">
            <TreeView.Resources>
                <HierarchicalDataTemplate 
                    DataType="{x:Type loc:ProductType}"
                    ItemsSource="{Binding AvailableInstallerObjects}">
                    <TextBlock Text="{Binding Description}" />
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type loc:InstallerObject}">
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding Path=IsSelected}" 
                                  VerticalAlignment="Center" Margin="5"/>
                        <TextBlock Text="{Binding Path=FileName}" Margin="5" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
      </GroupBox>
    </Grid>
</Window>

それは何をしますか?見つかったデータの種類に基づいて、ツリー内にコントロールの階層を確立します。1 つ目HierarchicalDataTemplateは、各クラスのデータを表示する方法と、それらが階層内でどのように関連しているかを処理します。2 番目HierarchicalDataTemplateは、それぞれの表示方法を処理しますInstallerObject

メイン ウィンドウのコード ビハインド:

public partial class MainWindow : Window
{
    public ReadOnlyObservableCollection<ProductType> ProductTypes
    {
        get { return (ReadOnlyObservableCollection<ProductType>)GetValue(ProductTypesProperty); }
        set { SetValue(ProductTypesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ProductTypes.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ProductTypesProperty =
        DependencyProperty.Register("ProductTypes", typeof(ReadOnlyObservableCollection<ProductType>), typeof(MainWindow), new UIPropertyMetadata(null));

    public MainWindow()
    {
        this.InitializeComponent();

        this.ProductTypes = new ReadOnlyObservableCollection<ProductType>(
            new ObservableCollection<ProductType>()
            {
                new ProductType() 
                { 
                    Description = "Type A",
                    AvailableInstallerObjects = new ReadOnlyObservableCollection<InstallerObject>(
                        new ObservableCollection<InstallerObject>()
                        {
                            new InstallerObject() { FileName = "A" },
                            new InstallerObject() { FileName = "B" },
                            new InstallerObject() { FileName = "C" },
                        })
                },

                new ProductType() 
                { 
                    Description = "Type B",
                    AvailableInstallerObjects = new ReadOnlyObservableCollection<InstallerObject>(
                        new ObservableCollection<InstallerObject>()
                        {
                            new InstallerObject() { FileName = "A" },
                            new InstallerObject() { FileName = "D" },
                        })
                }
            });

        this.DataContext = this;
    }
}

ただし、これは完全に不正行為です。通常、MainWindow.csは DataContext として機能せず、これらすべてのものを持ちます。しかし、この例では、 のリストを作成し、ProductTypeProductTypeクラスにInstallerObjectインスタンスを設定しました。

私が使用したクラス、いくつかの仮定を行い、このビューモデルにより適したクラスに変更したことに注意してください。

public class InstallerObject
{
    public string FileName { get; set; }
    public string FileExtension { get; set; }
    public string Path { get; set; }
    public int Build { get; set; }
    public bool Configurable { get; set; }
    public int AverageInstallTime { get; set; }
    public bool IsSelected { get; set; }
}

public class ProductType
{
    public string Description { get; set; }
    public ReadOnlyObservableCollection<InstallerObject> AvailableInstallerObjects
    {
        get;
        set; 
    }
    public override string ToString()
    {
        return this.Description;
    }
}

InstallerObjectしたがって、MVVM では、現在のクラスはモデル レイヤーのようなものに思えます。ViewModel でこれを、View で管理しやすい一連のコレクション クラスに変換することを検討してください。ViewModel の考え方は、物事がどのように表示され、相互作用するかと同様にモデル化することです。InstallerObjectsビューへのバインドを容易にするために、フラット リストを階層データの新しいコレクションに変換します。

TreeView を使用およびカスタマイズするさまざまな方法の詳細: http://www.codeproject.com/Articles/124644/Basic-Understanding-of-Tree-View-in-WPF

于 2012-07-27T22:04:06.513 に答える
0

Build がコレクション型である必要がある場合。

したがって、クラスは例として次のように構成する必要があります。

Public Class Customer
 Public Property FirstName as string
Public Property LastName as string
Public Property CustomerOrders as observableCollection(OF Orders)
End Class

これにより、期待される結果が得られるはずです。メイン アイテム プレゼンターの各アイテムには、その顧客の注文にバインドされた姓名とコンボボックスが表示されます。私はそれが簡単であることを知っていますが、これで十分です。

于 2012-07-27T20:28:28.760 に答える