2013-05-28 117 views
2

我有一個繼承的ObservableCollection <一類雙[]>(姑且稱之爲 「識別TestClass」)。即雙數組的集合。我可以在XAML中使用這種類型的集合嗎?我試圖添加項目,但它看起來像我不能將雙數組添加爲項目。這甚至有可能嗎?的ObservableCollection <Double[]>和XAML

事情是這樣的:

<TestClass> 
    <x:Array Type="sys:Double"> 
    <!-- What comes here...? --> 
    </x:Array> 
</TestClass> 

其實,我寧願喜歡使用的ObservableCollection <雙[,]>但我認爲這是不可能的 - 二維數組我的意思。

幫我在這裏...... :)

回答

1

首先,你需要一個ViewModel。 ViewModel將是您的容器類,我們可以在其中插入自定義雙數組或從數據庫中獲取它們。如果它不只是一個查詢,則需要執行INotifyPropertyChanged(但是這是一個不同的主題):

namespace MyCompany.Common.ViewModels 
{ 
    using System.ComponentModel; 
    using System.Runtime.CompilerServices; 

    public class PointsArrayVM 
    { 
     private double[] _points; 
     public double[] Points 
     { 
      get 
      { 
       return _points; 
      } 
      set 
      { 
       _points = value; 
      } 
     } 
    } 
} 

在這個例子中,我將添加雙[](firstArray & secondArray)的兩個自定義記錄。我那麼集合分配到CollectionViewSource,和(只是爲了說明),我給你從數據庫中更多的記錄到第二CollectionViewSource與暴露MainViewModel財產,列表<PointsArrayVM> DatabasePoints。如果它不只是一個查找,你將需要一個ObservableCollection而不是一個List。在XAML中,下Window.Resources,添加以下內容:

<x:Array x:Key="firstArray" Type="sys:Double" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <sys:Double>1.1</sys:Double> 
     <sys:Double>1.2</sys:Double> 
     <sys:Double>1.3</sys:Double> 
    </x:Array> 

    <x:Array x:Key="secondArray" Type="sys:Double" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <sys:Double>2.1</sys:Double> 
     <sys:Double>2.2</sys:Double> 
     <sys:Double>2.3</sys:Double> 
    </x:Array> 

    <x:Array x:Key="pointsArray" Type="{x:Type viewmodels:PointsArrayVM}" 
      xmlns:viewmodels="clr-namespace:MyCompany.Common.ViewModels;assembly=Common"> 
     <viewmodels:PointsArrayVM Points="{StaticResource firstArray}"/> 
     <viewmodels:PointsArrayVM Points="{StaticResource secondArray}"/> 
    </x:Array> 

    <CollectionViewSource x:Key="customPointsCollectionViewSource" Source="{StaticResource pointsArray}"/> 
    <CollectionViewSource x:Key="databasePointsCollectionViewSource" Source="{Binding DatabasePoints}"/> 

現在,我們有我們的CollectionViewSources,我們可以將其添加到同一個CollectionContainers CompositeCollection。在這個例子中,我用點[0]作爲顯示文本,並點1爲所選值:

<ComboBox Text="{Binding PointsFilter}" VerticalAlignment="Top" 
      SelectedValuePath="Points[0]" DisplayMemberPath="Points[1]"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Source={StaticResource customPointsCollectionViewSource}}"/> 
      <CollectionContainer Collection="{Binding Source={StaticResource databasePointsCollectionViewSource}}"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

我希望這有助於!對於一些非常翔實的XAML提示,請看this網站。


關於你提到的第二個問題

是,WPF似乎與在多維數組分配控制路徑特定時間點的問題。但是,您可以變通的作法也有Points2DArray視圖模型包含PointsArrayVM對象的數組:

namespace MyCompany.Common.ViewModels 
{ 
    using System.ComponentModel; 
    using System.Runtime.CompilerServices; 

    public class Points2DArrayVM 
    { 
     private PointsArrayVM[] _pointsArrays; 
     public PointsArrayVM[] PointsArrays 
     { 
      get 
      { 

       return _pointsArrays; 
      } 
      set 
      { 
       _pointsArrays = value; 
      } 
     } 
    } 
} 
在XAML

所以,你現在可以把一個視圖模型的集合到另一個容器視圖模型:

<x:Array x:Key="pointsArray1" Type="{x:Type viewmodels:PointsArrayVM}" 
     xmlns:viewmodels="clr-namespace:MyCompany.Common.ViewModels;assembly=Common"> 
    <viewmodels:PointsArrayVM Points="{StaticResource firstArray}"/> 
    <viewmodels:PointsArrayVM Points="{StaticResource secondArray}"/> 
</x:Array> 

<x:Array x:Key="pointsArray2" Type="{x:Type viewmodels:PointsArrayVM}" 
     xmlns:viewmodels="clr-namespace:MyCompany.Common.ViewModels;assembly=Common"> 
    <viewmodels:PointsArrayVM Points="{StaticResource firstArray}"/> 
    <viewmodels:PointsArrayVM Points="{StaticResource secondArray}"/> 
</x:Array> 

<x:Array x:Key="points2DArray" Type="{x:Type viewmodels:Points2DArrayVM}" 
     xmlns:viewmodels="clr-namespace:MyCompany.Common.ViewModels;assembly=Common"> 
    <viewmodels:Points2DArrayVM PointsArrays="{StaticResource pointsArray1}"/> 
    <viewmodels:Points2DArrayVM PointsArrays="{StaticResource pointsArray2}"/> 
</x:Array> 

<CollectionViewSource x:Key="customPointsCollectionViewSource" Source="{StaticResource points2DArray}"/> 

然後在你的組合框,它會是這樣的:

<ComboBox Text="{Binding PointsFilter}" VerticalAlignment="Top" 
      SelectedValuePath="PointsArrays[0].Points[0]" DisplayMemberPath="PointsArrays[0].Points[1]"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Source={StaticResource customPointsCollectionViewSource}}"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 
相關問題