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

Заранее спасибо
...
Рейтинг: 0 / 0
Теоретический вопрос с выбором инструментов
    #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
Теоретический вопрос с выбором инструментов
    #39130080
Света7415
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

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


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