Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Как заставить DataPager работать!?  [new]
Spirale
Member

Откуда:
Сообщений: 4
Добрый день! Уже долгое время бьюсь над следующей проблемой..

Есть класс ImageCollection который помещает в свою коллекцию картинки:

namespace Images.MyColl
{
    // To significantly reduce the sample data footprint in your production application, you can set
    // the DISABLE_IMAGES conditional compilation constant and disable sample data at runtime.
#if DISABLE_IMAGES
	internal class ImageCollection { }
#else

    public class ImageCollection : System.ComponentModel.INotifyPropertyChanged
    {
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }

        public ImageCollection()
        {
            try
            {
                System.Uri resourceUri = new System.Uri("/Silva;component/Images/ImageCollection/ImageCollection.xaml", System.UriKind.Relative);
                if (System.Windows.Application.GetResourceStream(resourceUri) != null)
                {
                    System.Windows.Application.LoadComponent(this, resourceUri);
                }
            }
            catch (System.Exception)
            { }
        }

        private ItemCollection _Collection = new ItemCollection();
        public ItemCollection Collection
        {
            get
            {
                return this._Collection;
            }
        }
    }

    public class ItemCollection : System.Collections.ObjectModel.ObservableCollection<Item>
    { }

    public class Item : System.ComponentModel.INotifyPropertyChanged
    {
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }

        private System.Windows.Media.ImageSource _image = null;
        public System.Windows.Media.ImageSource image
        {
            get
            {
                return this._image;
            }
            set
            {
                if (this._image != value)
                {
                    this._image = value;
                    this.OnPropertyChanged("image");
                }
            }
        }
    }
#endif
}

Когда приложение собирается, он выступает в роли ресурса с ключом ImageCollect, как видно ниже:
<Application x:Class="Silva.App"
	    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	    xmlns:Images="clr-namespace:Images.MyColl"
	    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	    mc:Ignorable="d">

    <Application.Resources>
        <ResourceDictionary>
            <Images:ImageCollection x:Key="ImageCollect" d:IsDataSource="True"/>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Assets/Styles.xaml"/>
                <ResourceDictionary Source="Assets/Templates.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Всё это барахло :) у меня отлично работает в ListBox на MainPage.xaml (картинки меняются по нажатию клавиш вверх-вниз), щас покажу как там всё забиндено:
<UserControl
    x:Class="Silva.MainPage"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
    xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
    xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="768">

<Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">

<!-- Header -->
...........

<!-- Body -->
        <Grid x:Name="ContentGrid" Style="{StaticResource LayoutRootGridStyle}" DataContext="{Binding Source={StaticResource ImageCollect}}" Margin="0,80">

            <sdk:DataPager x:Name="ImageCollectionDataPager" Template="{StaticResource DataPagerTemplate}"
                           Style="{StaticResource DataPagerStyle}" d:LayoutOverrides="Width" Margin="0,200,0,0"/>
            <ListBox x:Name="ImageCollectionListBox" Height="200" VerticalAlignment="Top" BorderThickness="0" Background="{StaticResource TransparentWhiteBrushKey}"
                     ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" Padding="0"
                     ItemsSource="{Binding Collection}" ItemContainerStyle="{StaticResource ListBoxItemStyle}"/>
        </Grid>

<!-- Footer-->
...........

    </Grid>

</UserControl>

Как видно там есть ImageCollectionDataPager, который я хочу прикрутить "за место" кнопочек клавиатуры.
Если обратиться к msdn http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datapager(v=VS.95).aspx
то там сказано, назначить ItemsSource свойство элемента управления(в данном случае это ListBox) и свойство DataPager..::..Source одной и той же коллекции данных. Также необходимо чтобы эта коллекция обеспечивала функциональные возможности разбиения по страницам. Я хотел в коде MainPage.xaml.cs получить коллекцию из ресурсов и обернуть её в класс PagedCollectionView, примерно так:
using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Navigation;

namespace Silva
{
    using Silva.Views;
    using Images.MyColl;

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            ImageCollection tx = App.Current.Resources[ImageCollect];
            PagedCollectionView ty = new PagedCollectionView(tx.Collection);
            ImageCollectionDataPager.Source = ty;
        }
    }
}
Но не могу получить ресурс, может кто-то предложит другую организацию получения этого дела, для достижения результата.
Может кто-то предложит немного изменить класс ImageCollection, чтобы уже в нем отнаследоваться от интерфейса IPagedCollectionView или же просто поместить полем PagedCollectionView. Как будет лучше?
6 июн 11, 17:39    [10772152]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить DataPager работать!?  [new]
Spirale
Member

Откуда:
Сообщений: 4
Удалось все реализовать как задумано. Некоторые нюансы:
Получить ресурс ImageCollect в функции public MainPage() никак нельзя, его просто не существует на тот момент, обошел так:
using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Navigation;

namespace Silva
{
    using Silva.Views;
    using Images.MyColl;
    using System.Windows.Data;

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            var col = Application.Current.Resources["ImageCollect"];
            
            PagedCollectionView mycol = new PagedCollectionView(((ImageCollection)col).Collection);
            ImageCollectionListBox.ItemsSource = mycol;
            ImageCollectionDataPager.Source = mycol;
        }
        //.........
    }

}
Далее поступаем как в статье на msdn, при этом необходимо убрать из xaml файла binding на ItemsSource у ImageCollectionListBox, как было реализовано ранее.
7 июн 11, 12:48    [10776092]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить