2012-07-27 65 views
0

當前設置

我有一個代表安裝程序文件和有關文件的一些屬性的自定義類,應符合以下接口綁定對象列表定製的ItemTemplate到的ItemsControl在MVVM

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

ViewModel有一個名爲AvailableInstallerObjectsReadOnlyObservableCollection<IInstallerObject>屬性。

我的View有一個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屬性,顯示可用產品的列表,以表示對IInstallerObject S中ProductType的可用Build屬性值ComboBox

我可以在ViewModel中使用LINQ來提取分組,但我不知道如何綁定到我已經提取的分組。

我的研究也發現了使用CollectionViewSource的可能性,但我不確定如何將其應用於我當前的設置。

我很感謝你的幫助。我願意學習,所以如果我忽略了一些明顯的情況,請直接告訴我這些信息,我很樂意教育自己。

回答

0

如果Build應該是一個集合類型。

所以你的班級應該以這樣的結構爲例。

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

這應該會給你預期的結果。主要項目演示者中的每個項目都將顯示名字姓氏和綁定到該客戶訂單的組合框。 我知道這很簡單,但應該這樣做。

0

您只需在視圖中聲明CollectionViewSource並將其綁定到ObservableCollection即可。在這個對象中,你聲明瞭一個或多個GroupDescriptions,它將源分成幾個組。

將此源綁定到列表框,爲組描述創建一個模板並完成。

一個例子可以在這裏找到:WPF Sample Series – ListBox Grouping, Sorting, Subtotals and Collapsible Regions。關於CollectionViewSource的更多信息可以在這裏找到:WPF’s CollectionViewSource

0

你的問題的描述使我相信你正在尋找某種類型的colapsing /展開/分組/樹視圖的東西。

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> 

是什麼呢?那麼,它會根據找到的數據類型在樹中建立一個控制層次結構。第一個HierarchicalDataTemplate處理如何顯示每個類的數據以及它們在層次結構中的關係。第二個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的,並有所有這些東西。但是對於這個例子,我只是讓它列出了ProductType s,並用InstallerObject實例填充了每個ProductType類。我用

類,注意我做了一些假設和修改你的類,以更好地適應這個視圖模型:

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

所以,在MVVM,在我看來,你的當前InstallerObject類更是一個模型層層次的東西。您可能會考慮將其在ViewModel中轉換爲一組更易於在View中管理的集合類。 ViewModel中的想法是對事物進行建模,類似於它們將如何被觀察和對話。將您的扁平列表InstallerObjects轉換爲分層數據的新集合,以便更容易地綁定到視圖。

有關各種使用和自定義TreeView的方法的更多信息:http://www.codeproject.com/Articles/124644/Basic-Understanding-of-Tree-View-in-WPF

相關問題