2

我有一个继承 ObservableCollection< Double[] > 的类(我们称之为“TestClass”)。即双数组的集合。我可以在 XAML 中使用这种集合吗?我正在尝试添加项目,但看起来我无法将双数组添加为项目。这甚至可能吗?

像这样的东西:

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

实际上,我更愿意使用 ObservableCollection< Double[,] > 但我认为这是不可能的 - 我的意思是二维数组。

帮帮我... :)

4

1 回答 1

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

在此示例中,我将添加两个自定义记录 double[](firstArray 和 secondArray)。然后,我将集合分配给 CollectionViewSource,并且(只是为了说明)我将数据库中的更多记录分配给具有公开 MainViewModel 属性List<PointsArrayVM> DatabasePoints的第二个 CollectionViewSource 。如果它不仅仅是一个查找,您将需要一个 ObservableCollection 而不是一个列表。在您的 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 中。在此示例中,我使用 Points[0] 作为显示文本,使用 Points 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 提示,请查看站点。


关于你的第二个问题

是的,WPF 似乎在将控制路径分配给多维数组中的特定点时存在问题。但是,您也可以使用包含 PointsArrayVM 对象数组的 Points2DArray ViewModel 来解决此问题:

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 中,您现在可以将一个 ViewModel 的集合放入另一个容器 ViewModel 中:

<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 中,它将类似于:

<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>
于 2013-07-17T09:36:33.143 回答