powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
14 сообщений из 14, страница 1 из 1
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37325669
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется следующий 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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37325742
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stukselbax,

без VisualTreeHelper не обойтись, воспользуйтесь им, только если вы пишите на WPF не знаю, есть он там или нет.
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37325796
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужен никакой 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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37326002
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37326436
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь binding'и в xaml
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37326727
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

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

SeVaПроверь binding'и в xaml
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37326740
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не было недопониманий, выкладываю 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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37326786
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставь CommandParameter="{Binding /}"
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37327085
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVa,

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

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

А у меня все катит.
Разбирайся сам. Если тебе в лом лишнюю строчку написать,что происходит, то мне и подавно
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37327704
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;
А если по делу нечего сказать, лучше молчать.
...
Рейтинг: 0 / 0
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37327747
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37327786
stukselbax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На случай, если кому-то понадобится.
Если нет возможности сделать команду 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
Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
    #37327975
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другие решения есть, но в книгах они не описаны
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание редактируемого ItemsControl с DataTemplate по шаблону MVVM
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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