Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM / 14 сообщений из 14, страница 1 из 1
27.06.2011, 11:43
    #37325669
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Имеется следующий DataTemplate у ItemsControl-a
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<DataTemplate>
    <Expander>
         <Expander.Header>
              <StackPanel>
                    <TextBlock Margin="2" Text="{Binding Name}" />
                    <TextBlock>               
                          <Hyperlink>
                                 <Run Text="Delete group" />
                          </Hyperlink>
                    </TextBlock>
              </StackPanel>
         </Expander.Header>
         <Expander.Content>
               blah-blah-blah
         </Expander.Content>
     </Expander>
</DataTemplate>

Нужно чтобы при нажатии на гиперлинк в заголовке экспандера удалялся соответствующий экспандер (тот, в заголовке которого лежит кликнутый гиперлинк). Пытаюсь блюсти MVVM, поэтому не пользуюсь поиском по DataTemplate-сгенерированному контенту. Подозреваю, что нужно создать Command, но что написать в code-behind? - ума не приложу. Как получить ссылку на соответствующий экспандер?. Видел схожие реализации, отличие заключалось в том, что они испльзовали ListView, у которого есть SelectedItem. В моём ItemsControl SelectedItem всегда null.
...
Рейтинг: 0 / 0
27.06.2011, 12:35
    #37325742
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
stukselbax,

без VisualTreeHelper не обойтись, воспользуйтесь им, только если вы пишите на WPF не знаю, есть он там или нет.
...
Рейтинг: 0 / 0
27.06.2011, 13:20
    #37325796
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Не нужен никакой VisualTreeHelper

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<DataTemplate>
    <Expander>
         <Expander.Header>
              <StackPanel>
                    <TextBlock Margin="2" Text="{Binding Name}" />
                    <Button Content="Удалить" 
				Command="{Binding DeleteCommand}" CommandParameter="{Binding}"              
				 />
              </StackPanel>
         </Expander.Header>
         <Expander.Content>
               blah-blah-blah
         </Expander.Content>
     </Expander>
</DataTemplate>

У команды DeleteCommand входным параметром будет текущий объект в списке.
...
Рейтинг: 0 / 0
27.06.2011, 15:11
    #37326002
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
SeVa,

Сделал следующий вариант (подходящий под Ваше описание)

Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
public class FileGroupViewModel : ViewModelBase
    {
        private ObservableCollection<FileGroup> filegroup;
        public FileGroupViewModel()
        {
            filegroup = new ObservableCollection<FileGroup>()
            {
                new FileGroup() 
                {Name = "Crack", DisplayName = "Break", Foles = new List<Files>()
                                                                    {new Files() {Name = "C:123"}, 
                                                                     new Files() {Name = "V:321"}}},
                                                                     new FileGroup() 
                {Name = "Casdasdasdrack", DisplayName = "Break", Foles = new List<Files>()
                                                                    {new Files() {Name = "C:123"}, 
                                                                     new Files() {Name = "V:321"}}},
                                                                     new FileGroup() 
                {Name = "Craqweqweqweqweck", DisplayName = "Break", Foles = new List<Files>()
                                                                    {new Files() {Name = "C:123"}, 
                                                                     new Files() {Name = "V:321"}}}
            };
        }
        public ObservableCollection<FileGroup> Filegroup
        {
            get
            {
                return filegroup;
            }
            set
            {
                filegroup = value;
            }
        }
        public ICommand DeleteGroup
        {
            get
            {
                return new RemoveItemCommand<FileGroup>(Filegroup);
            }
        }
    }
    public class RemoveItemCommand<T> : ICommand
    {
        private ICollection<T> _items;
        public RemoveItemCommand(ICollection<T> items)
        {
            _items = items;
        }
        public void Execute(object parameter)
        {
            _items.Remove((T)parameter);
        }
        public bool CanExecute(object parameter)
        {
            return true;
        }
        public event EventHandler CanExecuteChanged;
    }


Биндился к команде следующим образом:
Код: plaintext
1.
2.
3.
<Hyperlink Command="{Binding DeleteGroup}" CommandParameter="{Binding}">
     <Run Text="Delete group" />
</Hyperlink>

Вариант оказался нерабочим.
...
Рейтинг: 0 / 0
27.06.2011, 19:58
    #37326436
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Проверь binding'и в xaml
...
Рейтинг: 0 / 0
28.06.2011, 08:46
    #37326727
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
SeVa,

Даже в Design Mode биндинг показывает элементы, которые инициализированы в конструкторе. Не понимаю, что Вы имели ввиду под словами

SeVaПроверь binding'и в xaml
...
Рейтинг: 0 / 0
28.06.2011, 09:00
    #37326740
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Чтобы не было недопониманий, выкладываю xaml
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
<UserControl x:Class="WPFmvvmTRY.View.FileGroupView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:vm="clr-namespace:WPFmvvmTRY.ViewModel"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <vm:FileGroupViewModel x:Key="viewmodel" />
    </UserControl.Resources>
    <DockPanel DataContext="{Binding Source={StaticResource viewmodel}}">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Filegroup, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Expander>
                            <Expander.Header>
                                <StackPanel>
                                    <TextBlock Margin="2" Text="{Binding Name}"></TextBlock>
                                    <TextBlock>
                                        <Hyperlink>
                                            <Run Text="Rename"/>
                                        </Hyperlink>
                                        <Run Text=" | "></Run>
                                        <Hyperlink>
                                            <Run Text="Add path"/>
                                        </Hyperlink>
                                        <Run Text=" | "></Run>
                                        <Hyperlink Command="{Binding DeleteGroup}" CommandParameter="{Binding}">
                                            <Run Text="Delete group"/>
                                        </Hyperlink>
                                    </TextBlock>
                                </StackPanel>
                            </Expander.Header>
                            <Expander.Content>
                                <ItemsControl ItemsSource="{Binding Foles}">
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}"/>
                                                <TextBlock><Hyperlink><Run Text="Remove path" /></Hyperlink></TextBlock>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </Expander.Content>
                        </Expander>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </DockPanel>
</UserControl>

...
Рейтинг: 0 / 0
28.06.2011, 09:43
    #37326786
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Поставь CommandParameter="{Binding /}"
...
Рейтинг: 0 / 0
28.06.2011, 12:53
    #37327085
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
SeVa,

Не катит... :(
...
Рейтинг: 0 / 0
28.06.2011, 14:47
    #37327326
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
stukselbaxSeVa,

Не катит... :(

А у меня все катит.
Разбирайся сам. Если тебе в лом лишнюю строчку написать,что происходит, то мне и подавно
...
Рейтинг: 0 / 0
28.06.2011, 17:46
    #37327704
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Для тех, кто столкнется с подобной проблемой, один из возможных примеров, как это можно сделать:
1) Сделать команду статичной. т.е. прописать во ViewModel:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public static ICommand DeleteGroup
{
    get
    {
        return new RemoveItemCommand<FileGroup>(Filegroup);
    }
}

2) Во View нужно пользоваться следующей вещью
Код: plaintext
1.
2.
3.
<Hyperlink Command="{x:Static vm:FileGroupViewModel.DeleteGroup}" CommandParameter="{Binding}">
    <Run Text="Delete group"/>
</Hyperlink>

Спасибо книжке WPF programmers referrence windows presentation with C# 4.0;
А если по делу нечего сказать, лучше молчать.
...
Рейтинг: 0 / 0
28.06.2011, 18:13
    #37327747
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
stukselbaxДля тех, кто столкнется с подобной проблемой, один из возможных примеров, как это можно сделать:
1) Сделать команду статичной. т.е. прописать во ViewModel:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public static ICommand DeleteGroup
{
    get
    {
        return new RemoveItemCommand<FileGroup>(Filegroup);
    }
}

2) Во View нужно пользоваться следующей вещью
Код: plaintext
1.
2.
3.
<Hyperlink Command="{x:Static vm:FileGroupViewModel.DeleteGroup}" CommandParameter="{Binding}">
    <Run Text="Delete group"/>
</Hyperlink>

Спасибо книжке WPF programmers referrence windows presentation with C# 4.0;
А если по делу нечего сказать, лучше молчать.

1.Единственно правильный вывод - начинать нужно с книжек, чтобы понимать, как работает биндинг
2. Решение со статиком - практальный, пионерский метод. Возращаемся к пункту первому, потом c помощью RelativeSource делаем все тоже , но только нормальным способом.
3. После букварей, попытайся угадать ответ, на твои куцые вопросы в этом топике.
4. Кроме спецлитературы, возьми в библиотеке букварь с правилами хорошего тона.
...
Рейтинг: 0 / 0
28.06.2011, 18:45
    #37327786
stukselbax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
На случай, если кому-то понадобится.
Если нет возможности сделать команду static, можно сделать так:
Код: plaintext
1.
2.
3.
<Hyperlink Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl},  Path=DataContext.DeleteFileGroup}" CommandParameter="{Binding}">
     <Run Text="Delete group"/>
</Hyperlink>
Вариант плох поиском предка. В процессе поиска других решений.
...
Рейтинг: 0 / 0
28.06.2011, 22:50
    #37327975
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Другие решения есть, но в книгах они не описаны
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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