WPF: SelectAll \ UnSelectAll с MVVM - PullRequest
       1

WPF: SelectAll \ UnSelectAll с MVVM

1 голос
/ 18 марта 2019

У меня есть приложение WPF, и я работаю там с MVVM. У меня есть ViewModel, где я держу 2 закрытых члена ObservableCollection (Test - это класс, который я создал). Мое главное окно имеет TabControl, каждая вкладка связана с другой коллекцией ObservableCollection.

MVVM работает при первой загрузке (если isChecked элемента ObservableCollection равен true - checkBox проверен, а если нет - checkBox не проверен).

Я добавил флажок для SelectAll или UnselectAll. При нажатии на него - я иду к определенной ObservableCollection и меняю все члены IsChecked соответственно на флажок SelectAll. Проблема в том, что я не вижу его в графическом интерфейсе (первая загрузка сохраняется, и меняюсь, только если я нажимаю на каждый флажок вручную)

Должен ли я как-то "обновить" графический интерфейс? Спасибо.

ViewModel.cs

private ObservableCollection<Test> _basicTests;
private ObservableCollection<Test> _advancedTests;

    public ObservableCollection<Test> BasicTests
    {
        get { return _basicTests; ; }
        set
        {
            _basicTests = value;
            OnPropertyChanged("BasicTests");
        }
    }
    public ObservableCollection<Test> AdvancedTests
    {
        get { return _advancedTests; ; }
        set
        {
            _advancedTests = value;
            OnPropertyChanged("AdvancedTests");
        }
    }

    private void OnPropertyChanged(string propertyname)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyname));
        }
    }
}

MainWindow.xaml:

    <TabControl x:Name="tabControl" Margin="0,135,0,0" TabStripPlacement="Left">
        <TabItem Header="Basic">
            <ListView x:Name="basicTestsList" ItemsSource="{Binding BasicTests}" Background="#FFE5E5E5">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="cbListOfBasicTests" 
                                    IsChecked="{Binding IsChecked}" 
                                    Content="{Binding Name}"
                                    Margin="0,5,0,0"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </TabItem>
        <TabItem Header="Advanced">
            <ListView x:Name="advancedTestsList" ItemsSource="{Binding AdvancedTests}" Background="#FFE5E5E5">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="cbListOfAdvancedTests" 
                                    IsChecked="{Binding IsChecked}" 
                                    Content="{Binding Name}" 
                                    Margin="0,5,0,0"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </TabItem>
    </TabControl>

Test.cs:

class Test
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

ObservableCollection вызовет событие OnPropertyChanged только при добавлении или удалении элементов. Если вы хотите, чтобы пользовательский интерфейс обновлялся при изменении свойства IsChecked, Class Test должен вызвать событие OnPropertyChanged при изменении IsChecked:

class Test
{
    private bool isChecked;
    public bool IsChecked
    {
        get { return this.isChecked; }
        set
        {
            this.isChecked= value;
            this.OnPropertyChanged("IsChecked");
        }
    }
}
0 голосов
/ 18 марта 2019

Если вы не хотите менять модель и добавлять OnPropertyChanged, вы можете сделать что-то вроде этого:

_basicTests = new ObservableCollection(_basicTests.ForEach(bt => bt.IsChecked = true));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...