首先,你需要一个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>