0

У меня есть LongListSelector в телефоне Windows 8, я хочу привязать два ObservableCollections к LongListSelector. Вопрос в том, как я поддерживаю множественное связывание в LongListSelectorКак сделать CompositeCollection в WP8?

поиск в Интернете ... кто-то предлагает CompositeCollection, windows phone dev env не может идентифицировать CompositeCollection, поддерживает ли Windows телефон CompositeCollection?

<phone:LongListSelector 
        x:Name="articleList" 
        Grid.Row="1" 
        Margin="0,0,-12,0" 
        DataContext="{StaticResource viewModel}" 
        ItemTemplate="{StaticResource ResultItemTemplate}" 
        ItemsSource="{Binding ArticleCollection}" 
        ItemRealized="articleList_ItemRealized" 
        SelectionChanged="LongListSelector_SelectionChanged" 

        > 


<DataTemplate x:Key="ResultItemTemplate"> 
      <Grid Margin="0,6,0,0"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="*"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <Rectangle Fill="Gray" Height="50" Width="50" Grid.Row="0" Grid.Column="0" 
         VerticalAlignment="Top" Margin="0,7,7,0" 
         Grid.RowSpan="2"> 

       </Rectangle> 
       <Image Source="{Binding ImageUriCollection.ImageSource}" Height="50" Width="50" Grid.Row="0" Grid.Column="0" 
         VerticalAlignment="Top" Margin="0,7,7,0" 
         Grid.RowSpan="2"> 

        <!-- 
        <Image.Source> 
         <BitmapImage UriSource="{Binding Path= ImageUriCollection.ImageSource, Mode=TwoWay}" 
            CreateOptions="BackgroundCreation"/> 
        </Image.Source> 
        --> 
       </Image> 
       <TextBlock Text="{Binding Path=Subject, Mode=TwoWay}" Grid.Row="0" Grid.Column="1" 
           Foreground="{StaticResource PhoneAccentBrush}" VerticalAlignment="Top"/> 

       <TextBlock Text="{Binding Path=Words, Mode=TwoWay}" TextWrapping="Wrap" 
           Grid.Row="1" Grid.Column="1" 
           VerticalAlignment="Top" 
           /> 

      </Grid> 
     </DataTemplate> 

код позади в ViewModel является

public ObservableCollection<Article> ArticleCollection 
     { 
      get; 
      private set; 
     } 

     public ObservableCollection<Photo> ImageUriCollection 
     { 
      get; 
      private set; 
     } 

модель

public class Article : INotifyPropertyChanged 
    { 
     private int _Id; 
     public int ID 
     { 
      get { return _Id; } 
      set 
      { 
       if (_Id != value) 
       { 
        _Id = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 


     private string _subject; 
     public string Subject 
     { 
      get 
      { 
       return _subject; 
      } 
      set 
      { 
       if (_subject != value) 
       { 
        _subject = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private string _words; 
     public string Words 
     { 
      get 
      { 
       return _words; 
      } 
      set 
      { 
       if (_words != value) 
       { 
        _words = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private DateTime _publishDate; 
     public DateTime PublishDate 
     { 
      get 
      { return _publishDate; } 
      set 
      { 
       if (_publishDate != value) 
       { 
        _publishDate = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     private string _imagePath; 
     public string ImagePath 
     { 
      get { return _imagePath; } 
      set 
      { 
       if (_imagePath != value) 
       { 
        _imagePath = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (null != handler) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 


public class Photo 
    { 
     public string Title { get; set; } 
     public Uri ImageSource { get; set; } 
     public DateTime TimeStamp { get; set; } 
    } 

ответ

0

Это как @venerik said - CompositeCollection не доступен на Windows Phone.

Но мое предложение - написать собственный класс Composite. Я сумел построить a simple example:

В XAML: - простой ListBox (конечно, это может быть LLS)

<Grid x:Name="LayoutRoot" Background="Transparent">  
    <ListBox Name="myList" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

В коде позади: - пользовательский класс

public class myComposite<T> : ICollection<T> 
{ 
    ObservableCollection<T> firstCollection; 
    ObservableCollection<T> secondCollection; 

    public myComposite(ObservableCollection<T> first, ObservableCollection<T> second) 
    { 
     firstCollection = first; 
     secondCollection = second; 
    } 

    IEnumerator IEnumerable.GetEnumerator() { return new myEnum<T>(this); } 
    public IEnumerator<T> GetEnumerator() { return new myEnum<T>(this); } 

    public int Count { get { return firstCollection.Count + secondCollection.Count; } } 
    public T this[int i] 
    { 
     get 
     { 
      if (i <= firstCollection.Count - 1) return firstCollection[i]; 
      else return secondCollection[i - firstCollection.Count]; 
     } 
     set 
     { 
      if (i <= firstCollection.Count - 1) firstCollection[i] = value; 
      else secondCollection[i - firstCollection.Count - 1] = value; 
     } 
    } 

    public void Add(T item) { throw new NotImplementedException(); } 
    public void Clear() { throw new NotImplementedException(); } 
    public bool Contains(T item) { throw new NotImplementedException(); } 
    public void CopyTo(T[] array, int arrayIndex) { throw new NotImplementedException(); } 
    public bool IsReadOnly { get { throw new NotImplementedException(); } } 
    public bool Remove(T item) { throw new NotImplementedException(); } 

    private class myEnum<T> : IEnumerator<T> 
    { 
     public myComposite<T> _items; 
     int position = -1; 

     public myEnum(myComposite<T> list) { _items = list; } 

     public bool MoveNext() 
     { 
      position++; 
      return (position < _items.Count); 
     } 

     public void Reset() { position = -1; } 

     object IEnumerator.Current { get { return Current; } } 

     public T Current 
     { 
      get 
      { 
       try { return _items[position]; } 
       catch (IndexOutOfRangeException) 
       { throw new InvalidOperationException(); } 
      } 
     } 

     public void Dispose() { } 
    } 
} 

И MainPage: - для испытания

public partial class MainPage : PhoneApplicationPage 
{ 
    ObservableCollection<string> listOne = new ObservableCollection<string>(); 
    ObservableCollection<string> listTwo = new ObservableCollection<string>(); 

    myComposite<string> composite; 
    public myComposite<string> Composite 
    { 
     get { return composite; } 
     set { composite = value; } 
    } 

    public MainPage() 
    { 
     InitializeComponent(); 

     listOne.Add("First"); 
     listOne.Add("Second"); 
     listOne.Add("Third"); 
     listTwo.Add("Fourth"); 
     composite = new myComposite<string>(listOne, listTwo); 
     myList.ItemsSource = Composite; 
    } 
} 

Обратите внимание, что это всего лишь очень простой пример - ему не хватает INotifyPropertyCh и большинство методов, которые должны быть реализованы. Но, надеюсь, это покажет вам, как это работает.

И, конечно, все коллекции должны иметь элементы того же типа.

+0

CompositeCollection не доступен на WP – max

+0

@max Вы прочитали мой ответ? Первое предложение? Я не использую CompositeCollection - я делаю свое. – Romasz

+1

жаль об этом, мой плохой. – max

0

Я не думаю, что CompositeCollection доступно на Windows Phone, и я не думаю, что он подходит для вашего проблема. A CompositeCollection может использоваться для объединения нескольких коллекций. Например, если у вас есть список из 5 овощей и список из 3 фруктов, вы можете присоединиться к ним, чтобы отобразить список из 8 предметов.

В вашем случае, я думаю, вы хотите присоединиться к статьям и фотографии, чтобы стать одним предметом. Почему вы не добавляете свойство «Фото» в свой класс статьи?

+0

thnx для ответа. Это действительно компромисс, который я делаю сейчас. дело в том, что мы проектируем базу данных, не сохраняем изображение Uri, просто сохраняем имя изображения. и нам нужно больше вещей делать на фотографиях позже .... – max