Почему не происходит обновление данных в ViewModel?

Добрый день!

Вопрос: почему не происходит изменение данных во ViewModel при действиях на форме?
Есть модель:
public class Checklist: ViewModel.BaseViewModel<br>
    {<br>
        public string Name { get; set; }<br>
        public bool IsSelected { get; set; }<br>
    }

Есть ViewModel:
public class ColumsViewModel:BaseViewModel
    {
        ObservableCollection<Models.Checklist> listc = new ObservableCollection<Models.Checklist>();
      
        public ObservableCollection<Models.Checklist> Listc
        {
            get { return listc; }
            set { listc = value;
                OnPropertyChanged("IsSelected");
            }
        }
        public ColumsViewModel(ObservableCollection<DataGridColumn> col)
        {
            foreach (DataGridColumn d in col)
            {

                if (d.Header != null)
                {
                    if (d.Visibility == Visibility.Visible)
                    {
                        
                        Listc.Add( new Models.Checklist { IsSelected = true, Name = d.Header.ToString() });
                    }
                    else
                    {
                        Listc.Add(new Models.Checklist { IsSelected = false, Name = d.Header.ToString() });
                    }
                }
            }
        }
    }


Форма:
<Window x:Class="WpfApp5.SetColums"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp5"
        mc:Ignorable="d"
        Title="SetColums" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="0.1*"/>
        </Grid.RowDefinitions>
        <ListBox x:Name="ch" ItemsSource="{Binding Listc}" >
            <ListBox.ItemTemplate>
                <HierarchicalDataTemplate>
                    <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                </HierarchicalDataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" >
            <Button Content="Применить"  Width="70" Height="20" Margin="0,0,10,0" IsDefault="True" Click="Button_Click"/>
            <Button Content="Отмена"  Width="70" Height="20"  Margin="0,2,0,3"   />
        </StackPanel>
       
    </Grid>
</Window>


На форме есть ListBox, который заполняется CheckBox-ами. Заполнение происходит корректно.
Однако если я снять выделенные checkbox, то обновление во ViewModel ( listc ) не происходит.

Как я понимаю, что обновление listc не происходит:
Во ViewModel на
set { listc = value;
                OnPropertyChanged("IsSelected");
            }

стоит breakpoint.
Запускаю приложение в режиме дебага. И снимаю и ставлю галочки в checkbox. Попадания в breakpoint не происходит.

BaseViewModel
public class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }


Просьба отвечать как можно более подробно, ибо wpf и mvvm занимаюсь совсем недавно.

Общий смысл задачи:
Получаю коллекцию столбцов datagrid.
Пользователь выбирает какие из столбцов ему необходимы.
  • Вопрос задан
  • 409 просмотров
Решения вопроса 1
@vakym Автор вопроса
Разобрался при помощи ребят с телеграм канала.
В данном случае обновление данных не происходит потому, что не правильно забиндил chekbox.

В надо тоже добавить ItemsSource="{Binding Listc}"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы