Модераторы: gambit, Kefir, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратится к элементу, который в Template, Как в коде узнать зн-ия элементов Templ 
V
    Опции темы
Чердак
  Дата 6.4.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Доброе вермя суток. 
Возникла такая проблема.  У меня есть ListView, для которого создаю Template, в котором ListView-шка и кнопка. В коде я добавляю новый Items в ListView (для которого создан Template). Затем нужно в коде, по нажатию кнопки в выделенном Item-е, узнать какой Item (в Template) выделен. Как мне можно это узнать? Как работать с Template?
Для ввода данных в Template использую Binding. А вот как например обратится к элементу (в моем случае - узнать SelectedItem в Template) я не знаю.

--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



В обработчике щелчка по кнопке можно получить Item следующим образом:
Код

SomeClass someClassInstance = (SomeClass)listViewInstance.ItemContainerGenerator.ItemFromContainer(sender);



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Спкасибо, а можно объяснить это. Что-то не допонимаю. Как мне узнать SelectedIndex?
--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Чердак, а Вы внимательно посмотрите на методы объекта ItemContainerGenerator. Для получения SelectedIndex подойдет метод IndexFromContainer.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



У меня есть ListView (name ="lvRegionsIn"), в Template которого есть много чего, из которого мне нужно узнать номер выделенного итема (SelectedItem) в   ListView (name ="lvBorders").
--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Цитата(Чердак @  6.4.2009,  21:10 Найти цитируемый пост)
У меня есть ListView (name ="lvRegionsIn"), в Template которого есть много чего, из которого мне нужно узнать номер выделенного итема (SelectedItem) в   ListView (name ="lvBorders").

Не понял.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Для ListView я создаю Tempalate:
Код

<DataTemplate x:Key="RegionTemplate">
            <Expander Header="{Binding Path=KNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <Grid Width="Auto" Height="Auto" Background="{DynamicResource Fon}">
                     <ListView HorizontalAlignment="Stretch" Width="Auto" Height="Auto" Background="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}" IsSynchronizedWithCurrentItem="True" Margin="0,0,0,-6" Grid.RowSpan="1" Grid.ColumnSpan="2" x:Name="lvRegBorders" ItemsSource="{Binding Path=Borders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                         <ListView.View>
                             <GridView>
                                 <GridView.ColumnHeaderContextMenu>
                                     <ContextMenu/>
                                 </GridView.ColumnHeaderContextMenu>
                                 <GridViewColumn Header="От точки">
                                     <GridViewColumn.CellTemplate>
                                         <DataTemplate>
                                             <TextBox HorizontalAlignment="Stretch" Text="{Binding Path=PointFrom, Mode=TwoWay}"  BorderThickness="0,0,0,0"/>
                                         </DataTemplate>
                                     </GridViewColumn.CellTemplate>
                                 </GridViewColumn>
                                 <GridViewColumn Header="До точки">
                                     <GridViewColumn.CellTemplate>
                                         <DataTemplate>
                                             <TextBox HorizontalAlignment="Stretch" Text="{Binding Path=PointTo, Mode=TwoWay}" BorderThickness="0,0,0,0"/>
                                         </DataTemplate>
                                     </GridViewColumn.CellTemplate>
                                 </GridViewColumn>
                                 <GridViewColumn Header="Горизонтальное проложение (S), м" HeaderStringFormat="">
                                     <GridViewColumn.CellTemplate>
                                         <DataTemplate>
                                             <TextBox Text="{Binding Path=Distance, Mode=TwoWay}" HorizontalAlignment="Stretch" BorderThickness="0,0,0,0"/>
                                         </DataTemplate>
                                     </GridViewColumn.CellTemplate>
                                 </GridViewColumn>
                                 <GridViewColumn HeaderStringFormat="" Header="Описание" >
                                     <GridViewColumn.CellTemplate>
                                         <DataTemplate>
                                             <TextBox Text="{Binding Path=Description, Mode=TwoWay}" HorizontalAlignment="Stretch" BorderThickness="0,0,0,0"/>
                                         </DataTemplate>
                                     </GridViewColumn.CellTemplate>
                                 </GridViewColumn>
                                 <GridViewColumn HeaderStringFormat="" Header="Cмежные земельные участки" >
                                     <GridViewColumn.CellTemplate>
                                         <DataTemplate>
                                             <TextBox Text="{Binding Path=AdjacentPart, Mode=TwoWay}" HorizontalAlignment="Stretch" BorderThickness="0,0,0,0"/>
                                         </DataTemplate>
                                     </GridViewColumn.CellTemplate>
                                 </GridViewColumn>
                             </GridView>
                         </ListView.View>
                     </ListView>
                 </Grid>
////------.............................................
         </ControlTemplate.Triggers>
     </ControlTemplate>


в котором есть lvRegBorders, так же есть кнопка, на клик которой, необходимо узнать какой SelectedIndex в lvRegBorders был выбран.
--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



ListView вижу, lvRegBorders вижу. А что за кнопка? Где она расположена?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



в DataTemplate, Просто весь коде не вставил - большой.

Добавлено через 1 минуту и 42 секунды
а вот присваивание ItemTemplate к lvRegionsIn
Код

<ListView Width="Auto" IsSynchronizedWithCurrentItem="True"  Background="#7FFFFFFF" x:Name="lvRegionsIn" MinHeight="100" VerticalAlignment="Stretch" Height="Auto" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.RowSpan="1" Grid.ColumnSpan="3" ItemTemplate="{DynamicResource RegionTemplate}" ItemsSource="{Binding Path=RegionsIn, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />                


--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Цитата(Чердак @  6.4.2009,  21:31 Найти цитируемый пост)
в DataTemplate, Просто весь коде не вставил - большой. 

Я так понимаю, в DataTemplate ListView, а не lvRegBorders?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



вот кнопка в темплейте:
Код

             <Button Margin="0,0,0,0" VerticalAlignment="Stretch" Content="Удалить" Grid.Column="2" Grid.Row="18" Grid.RowSpan="1" Width="Auto" Height="Auto" Template="{DynamicResource ButtonControlPLUS}" Grid.ColumnSpan="1" FontSize="9" HorizontalAlignment="Stretch" x:Name="DelRegBorder" Click="DelRegBorder_Click"/>  


Добавлено через 34 секунды
нет! lvRegBorders в темплейте

Добавлено через 3 минуты и 18 секунд
Т.е. есть листвью (lvRegionIn) для итемов которого создан темплейт, а в этом темлейте есть еще одинн листвью ( с именем lvRegBorders), а так же кнопка (и еще много чего). Но проблема тошлько в том, что я не могу по нажатию кновки в коде определить какой итем в lvRegBorders выделен.
--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Цитата(Чердак @  6.4.2009,  21:36 Найти цитируемый пост)
нет! lvRegBorders в темплейте

Ну дык а я о чем?!

Чердак, старайтесь впредь сразу нормально формулировать задачу.
Итак, имея ссылку на кнопку (параметр sender обработчика), нужно получить ссылку на lvRegBorders, находящийся в одном DataTemplate с кнопкой.

Насчет ItemContainerGenerator я соврал (вернее, перепутал с подходом, применяемым в Xceed DataGridControl): для получения Сontainer'а (который для ListView имеет тип ListBoxItem) необходимо воспользоваться методом ListView.ContainerFromElement.

А вот дальше - самое интересное. Просто заюзать FindName для ListBoxItem не получится. Вот описание workaround'а: http://joshsmithonwpf.wordpress.com/2007/0...contentcontrol/ Не могу сказать, что мне нравится этот подход... но по крайней мере он работает. Правда, его придется немного модифицировать: ContentPresenter находится за Border'ом.

Вот реализация упрощенного примера:
Код

<Window x:Class="WpfApplication12.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
  <Grid>
    <ListView Name="lvRegionIn">
      <ListView.ItemTemplate>
        <DataTemplate>
          <StackPanel Name="StackPanel">
            <ListView Name="lvRegBorders">
            </ListView>
            <Button Name="DelRegBorder" Click="DelRegBorder_Click">Button</Button>
          </StackPanel>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>
  </Grid>
</Window>


Код

    public Window1()
    {
      InitializeComponent();

      this.lvRegionIn.ItemsSource = new List<int>() {1, 2, 3, 4, 5};
    }

    private void DelRegBorder_Click(object sender, RoutedEventArgs e)
    {
      Button button = (Button) sender;

      ListBoxItem listBoxItem = (ListBoxItem)this.lvRegionIn.ContainerFromElement(button);

      Border border = (Border)VisualTreeHelper.GetChild(listBoxItem, 0);
      ContentPresenter contentPresenter = (ContentPresenter)border.Child;
      ListView listView = (ListView)this.lvRegionIn.ItemTemplate.FindName("lvRegBorders", contentPresenter);

      MessageBox.Show("SelectedIndex = " + listView.SelectedIndex);
    }




--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



У меня возникает вот здесь ошибка: 
Код

 Border border = (Border)VisualTreeHelper.GetChild(listBoxItem, 0);

Ошибка:
Error    4    Cannot convert type 'System.Windows.DependencyObject' to 'VSoft.GEO.Mejevanie.Border'    D:\WORK\6.04.09\VSoft.GEO\VSoft.GEO.Mejevanie\WindowMain.xaml.cs    308    33    VSoft.GEO.Mejevanie

Дело в том что lvRegBorders - это у меня не просто список, а GridVeiw

а Border:
Код

 public class Border
    {

        public string PointFrom
        {
            get;
            set;
        }
        public string PointTo
        {
            get;
            set;
        }

        public double Distance
        {
            get;
            set;
        }


        public int Description
        {
            get;
            set;
        }


        public string AdjacentPart
        {
            get;
            set;
        }
    }

--------------------
PM MAIL   Вверх
Idsa
Дата 6.4.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Чердак, Ваша задача - добраться до ContentPresenter. Посмотрите в debug'е при помощи Mole (хотя, конечно, можно и методом тыка...), где находится ContentPresenter относительно listViewItem - и действуйте.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Чердак
Дата 6.4.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 8.12.2004

Репутация: нет
Всего: нет



Idsa, наверно что-то не понял. 

Цитата

Посмотрите в debug'е при помощи Mole (хотя, конечно, можно и методом тыка...), где находится ContentPresenter относительно listViewItem - и действуйте.


Как это сделать?
--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.