Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Windows Phone — DataTemplateSelector

Anna | 17.06.2014 | нет комментариев
В этой статье я расскажу что такое DataTemplateSelector, как создавать абстрактные и пользовательские классы DataTemplateSelector в Windows Phone 8. Что же такое DataTemplateSelector? — это класс тот, что обеспечивает выбор DataTemplate, основанного на объекте данных и элементе, связанным с данными (msdn). Иными словами, если у вас есть возможен ListBox, и вы хотите в нем отображать, единовременно, больше чем один DataTemplate (жанр отображения) для различных данных, тогда вам необходимо применять DataTemplateSelector с поддержкой которого вы сумеете сделать собственную логики для выбора DataTemplate.Для лучшей ясности разглядим как реализовать отвлеченный класс DataTemplateSelector.Теперь сделаем отвлеченный класс (для тех кто не знает какой класс именуется абстрактным читать msdn) тот, что является производным от ContentControl в нем с поддержкой виртуального способа SelectTemplate будет обеспечиваться логика для возврата соответствующего образца, и перегрузим OnContentChanhed тот, что исходит от базового класса.

public abstract class DataTemplateSelector : ContentControl
{
    public virtual DataTemplate SelectTemplate(object item,
        DependencyObject container)
    {
        return null;
    }

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);
        ContentTemplate = SelectTemplate(newContent, this);
    }
}

Дальше необходимо сделать так званный «кастомный» DataTemplateSelector тот, что будет наследоваться от DataTemplateSelector, это для того чтоб была вероятность выбора DataTemplate. Тут все легко.

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate Maximum { get; set; }
    public DataTemplate Middle { get; set; }
    public DataTemplate Minimum { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var myItem = item as Data;
        if (myItem != null)
        {
            switch (myItem.Type)
            {
                case "Maximum":
                    return Maximum;
                case "Middle":
                    return Middle;
                case "Minimum":
                    return Minimum;
            }
        }
        return base.SelectTemplate(item, container);
    }
}

А теперь немного пройдемся по нашему «кастомном» DataTemplateSelector. Это обыкновенный класс тот, что наследуется от DataTemplateSelector, в нем определено три свойства Maximum, Middle, Mimimum которые являются DataTemplate для выбора образцов. Дальше идет перезагрузка способа SelectTemplate в котором через оператор switch определяется данные выбора соответствующего DataTemplate.Позже этого напишем примитивный класс данных тот, что будет иметь свойства для привязки данных к нашему ListBox и сделаем несколько конструкторов, для различных DataTemplate свой отдельно:

public class Data
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Images { get; set; }
    public string Type { get; set; }

    #region Constructor
    public Data(string description, string name, string images, string type)
    {
        Description = description;
        Name = name;
        Images = images;
        Type = type;
    }
    public Data(string description, string name, string type)
    {
        Description = description;
        Name = name;
        Type = type;
    }
    public Data(string description, string type)
    {
        Description = description;
        Type = type;
    }
    #endregion
}

Все самое трудное мы сделали, все что нам остается это сделать ListBox с тремя различными образцами (Maximum, Middle, Minimum) и привязкою к нашему «кастомном» DataTemplateSelector, и безусловно наполнить наш ListBox.XAML ListBox:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ListBox x:Name="MyListBox">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <local:MyTemplateSelector>
                    <local:MyTemplateSelector.Maximum>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Margin="8" Source="{Binding Images}"
                            VerticalAlignment="Center" Width="48" Height="48"/>
                                <StackPanel>
                                    <TextBlock Margin="8" Text="{Binding Name}" Width="250"
                                    VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                    <TextBlock Width="100" Text="{Binding Description}" Margin="8,0,8,8"
                                    VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                    </local:MyTemplateSelector.Maximum>
                    <local:MyTemplateSelector.Middle>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Margin="8" Text="{Binding Name}" Width="250"
                                    VerticalAlignment="Top" HorizontalAlignment="Left" />
                                <TextBlock Width="250" Text="{Binding Description}" Margin="8,0,8,8"
                                    VerticalAlignment="Top" HorizontalAlignment="Left"/>
                            </StackPanel>
                        </DataTemplate>
                    </local:MyTemplateSelector.Middle>
                    <local:MyTemplateSelector.Minimum>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Margin="8" Text="{Binding Description}" Width="250"
                                    VerticalAlignment="Top" HorizontalAlignment="Left" />
                            </StackPanel>
                        </DataTemplate>
                    </local:MyTemplateSelector.Minimum>
                </local:MyTemplateSelector>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

И наконец заполнения данными, дозволено позже инициализации дописать либо перезагрузить способ OnNavigatedTo, либо еще как то придумать, это не столь значимо:

var list = new List<Data>();

var itemData0 = new Data("Notebook", "Dell", "Assets/BrandIcon/dellIcon.jpg", "Maximum");
var itemData1 = new Data("Mouse", "Zalman", "Middle");
var itemData2 = new Data("Ultrabook", "LG", "Assets/BrandIcon/lgIcon.jpg", "Maximum");
var itemData3 = new Data("Other", "Minimum");

list.Add(itemData0);
list.Add(itemData1);
list.Add(itemData2);
list.Add(itemData3);

MyListBox.ItemsSource = list;

Вот и все, дозволено компилировать и глядеть как в нашем ListBox отображаются сразу три различных DataTemplate. Чтоб отменнее разобраться как все работает соберите план сами, если не будет получаться то вот исходник GitHub.Пишите, пробуйте, ели что задавайте вопросы, буду рад подмогнуть :)

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB