Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Добавление визуального элемента в listView.


Автор: hexzo 24.8.2011, 14:23
Мне нужно быстренько, на небольшой промежуток времени в ListView добавить нетиповой элемент, а потом убрать его оттуда.
panelA.Items.Add(new TextBox());

А мне в ответ, что как бы нельзя, используй вместо этого ItemsSource.
Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

Цель такова.
1) Список отображает содержимое файловой системы.
2) Когда нужно создать директорию, я добавляю в список textbox куда вводится имя файла.
3) А когда вся нужная от него информация получена, убирается оттуда.

Как это осуществить с наименьшим гемороем?

Автор: Gvozdin 24.8.2011, 16:13
в стиле MVVM или MVP попробуйте
представьте директорию своим классом
и если директория будет новой(добавить её в ItemsSource вместе с настоящими директриями), то для неё отдельный шаблон с текст боксом c возможностью ввода названия

Автор: hexzo 24.8.2011, 19:04
Gvozdin
Цитата

представьте директорию своим классом

Примерно так и есть.

Цитата

и если директория будет новой(добавить её в ItemsSource вместе с настоящими директриями), то для неё отдельный шаблон с текст боксом c возможностью ввода названия

Как вариант я могу в классе для файла завести флажок в зависимости от которого триггер данных в стиле для элемента будет включать соответствующий шаблон.

Но я не въехал в один момент. Куда мне пихать шаблон?

Я могу указать шаблон для элемента в свойстве ItemTemplate класса ListView.
Код

  <ListView Height="209" HorizontalAlignment="Left" Margin="62,44,0,0" Name="listView1" VerticalAlignment="Top" Width="102">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Text}"></TextBox>
                </DataTemplate>
            </ListView.ItemTemplate>
                                      
            <TextBlock>1</TextBlock>
            <TextBlock>2</TextBlock>
            <TextBlock>3</TextBlock>
        </ListView>


Но если у меня использовано свойство View в котором у меня определены колонки, то свойство ItemTemplate работать перестаёт.

Код

  <ListView Height="209" HorizontalAlignment="Left" Margin="62,44,0,0" Name="listView1" VerticalAlignment="Top" Width="102">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Text}"></TextBox>
                </DataTemplate>
            </ListView.ItemTemplate>
            
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="name"> </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
                            
            <TextBlock>1</TextBlock>
            <TextBlock>2</TextBlock>
            <TextBlock>3</TextBlock>
        </ListView>


В классе  GridView я вижу свойство GridViewItemContainerStyleKey. Но оно почему то статическое. А в документации в его описании даже нет примера использования. И что с ним делать?

 smile 

Автор: hexzo 25.8.2011, 08:11
Надо шаблон пихать в CellTemplate.
Цитата

<ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="name">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding Path=Text}"></TextBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>

Автор: hexzo 25.8.2011, 08:30
Блин, а где свойство для стиля?  smile 

Автор: Gvozdin 25.8.2011, 09:11
Если вы делаете флаг IsNew у директории, то вам надо сделать в DataTemplate тригер который отобразит TextBox(скроет TextBlock).

Автор: hexzo 25.8.2011, 10:29
Gvozdin
Цитата

Если вы делаете флаг IsNew у директории, то вам надо сделать в DataTemplate тригер который отобразит TextBox(скроет TextBlock).

Тока триггер же должен быть в стиле, а свойства для стиля там нет. Но зато есть свойство CellTemplateSelector.

У меня просто слов на это wpf не хватает.  smile 

Автор: Gvozdin 25.8.2011, 10:36
Да вот так сделайте, какой стиль?

Код

        <DataTemplate>
            <Grid>
                <TextBlock x:Name="block"/>
                <TextBox x:Name="box" Visibility="Collapsed"/>
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsNew}" Value="True">
                    <Setter TargetName="block" Property="Visibility" Value="Collapsed"/>
                    <Setter TargetName="box" Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>


И вообще хочу сказать что ListView был актуален когда не было DataGrid, сейчас же для гридов лучше использовать DataGrid. Очень хороший контрол, проблем с ним почти нет.

Автор: hexzo 25.8.2011, 13:06
Gvozdin
Цитата

Да вот так сделайте, какой стиль?

А я так сам шаблон не переопределю. Наверное. smile А в стиле я могу разные шаблоны подставлять. 

Спасибо за помощь.

В итоге я решил, что лучше воспользоваться GreedViewColumn.CellTemplateSelector.

Автор: Gvozdin 25.8.2011, 20:31
Тоже вариант, но минус этого в том, что нельзя будет как в тригере по изменению свойства поменять сразу шаблон

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)