Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Теоретический вопрос с выбором инструментов / 3 сообщений из 3, страница 1 из 1
16.12.2015, 16:45
    #39129976
Света7415
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос с выбором инструментов
Здравствуйте,
Имею сериализированный лист, на его базе нужно создать панельки с различними кнопочками боксами и тд. Осложнение : первые два итема немного отличаются как друг от друга, так и от других (пары кнопок нет, пара другая) Как решают такие задачи? С формами просто: юзер контрол сделала и всё, а тут как? (может вставить из форм?)

Заранее спасибо
...
Рейтинг: 0 / 0
16.12.2015, 17:18
    #39130012
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос с выбором инструментов
немного не понял сути, какие то боксы и т.д.
Вы сериализовали данные, это не модель представления, по этому отобразить их вы не можете. Потому, что они не отражают то, что вы хотите визуализировать.
Следовательно на основе этого списка вам нужно создать модель представления в которой элементы списка вы обернёте в то представление, которое будет наилучшим образом подходить для отображения списка
представление
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
<Window x:Class="HelpKan.SvetaWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:helpKan="clr-namespace:HelpKan"
        Title="SvetaWindow" Height="300" Width="300"
        DataContext="{StaticResource MainModel2}">
    <Window.Resources>
        <helpKan:GenericTemplateSelector x:Key="TemplateSelector">
            <DataTemplate DataType="{x:Type helpKan:CheckedItem}">
                <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Name}"
                          Margin="3,1"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type helpKan:RadioItem}">
                <RadioButton IsChecked="{Binding IsChecked}" Content="{Binding Name}"
                             GroupName="{Binding GroupName}"
                             Margin="3,1"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type helpKan:SimpleItem}">
                <TextBlock Text="{Binding Name}"
                           Margin="3,1"/>
            </DataTemplate>
        </helpKan:GenericTemplateSelector>
    </Window.Resources>
    <Grid>
        <ScrollViewer>
            <ItemsControl ItemsSource="{Binding Items}" ItemTemplateSelector="{StaticResource TemplateSelector}"/>
        </ScrollViewer>
    </Grid>
</Window>


модель представления
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
    public abstract class BaseItem
    {
        protected BaseItem(string name)
        {
            Name = name;
        }
        public string Name { set; get; }
    }

    public class SimpleItem : BaseItem
    {
        public SimpleItem(string name) : base(name) {}
    }

    public class RadioItem : BaseItem
    {
        public RadioItem(string name) : base(name) {}
        public bool IsChecked { set; get; }
        public string GroupName { set; get; }
    }

    public class CheckedItem : BaseItem
    {
        public CheckedItem(string name) : base(name) {}
        public bool IsChecked { set; get; }
    }

    public class MainModel2 : BaseViewModel
    {
        public MainModel2()
        {
            var countryList = DataService.GetCountryNames().ToArray(); 
            Items = new List<BaseItem>();
            for (var i = 0; i < 5; i++)
            {
                Items.Add(new RadioItem(countryList[i]) { GroupName = "group1"}) ;
            }
            for (var i = 5; i < 10; i++)
            {
                Items.Add(new CheckedItem(countryList[i]));
            }
            for (var i = 10; i < countryList.Length; i++)
            {
                Items.Add(new SimpleItem(countryList[i]));
            }
        }

        public List<BaseItem> Items { set; get; }    
    }


"Модель данных"
Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class DataService
    {
        public static IEnumerable<string> GetCountryNames()
        {
            return CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(p => new RegionInfo(p.LCID).DisplayName).Distinct();
        }
    }


а вот универсальный селектор шаблона:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    [ContentProperty("Map")]
    public class GenericTemplateSelector : DataTemplateSelector
    {
        public IDictionary Map { set; get; }

        public GenericTemplateSelector()
        {
            Map = new Dictionary<DataTemplateKey, DataTemplate>();
        }

        public DataTemplate NullTemplate { set; get; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item == null) return NullTemplate;
            var type = new DataTemplateKey(item.GetType());

            if (Map.Contains(type)) return (DataTemplate)Map[type];
            throw new ArgumentOutOfRangeException();
        }
    }


результат работы (в окне только ItemsControl элемент):
...
Рейтинг: 0 / 0
16.12.2015, 18:20
    #39130080
Света7415
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос с выбором инструментов
Roman Mejtes,

Спасибо, осмысляю...
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Теоретический вопрос с выбором инструментов / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]