2013-05-28 2 views
2

У меня есть класс, который наследует ObservableCollection < Double []> (назовем его «TestClass»). То есть сбор двойных массивов. Могу ли я использовать такую ​​коллекцию в XAML. Я пытаюсь добавить элементы, но похоже, что я не могу добавить двойные массивы в качестве элементов. Возможно ли это?ObservableCollection <Double[]> и XAML

Что-то вроде этого:

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

На самом деле, я бы предпочел бы использовать ObservableCollection < Double [,]> но я думаю, что это невозможно - двумерный массив, который я имею в виду.

Помоги мне ... :)

ответ

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, мы можем добавить их к CompositeCollection с CollectionContainers. В этом примере я использую очки [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 ViewModel, который содержит массив объектов 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, теперь вы можете поместить коллекции одного 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> 
Смежные вопросы