c# - WPF:使用 MVVM 的 SelectAll\UnSelectAll

标签 c# wpf mvvm

我有一个 WPF 应用程序,我在那里使用 MVVM。
我有一个 ViewModel,我在其中拥有 2 个 ObservableCollection 私有(private)成员(Test 是我创建的一个类)。
我的 MainWindow 有一个 TabControl,每个选项卡都连接到另一个 ObservableCollection。

MVVM 在第一次加载时工作(如果 ObservableCollection 项的 isChecked 为真 - 选中复选框,如果不是 - 未选中复选框)。

我为 SelectAll 或 UnselectAll 添加了一个复选框。
单击它时 - 我转到特定的 ObservableCollection 并将所有 IsChecked 成员相应地更改为 SelectAll 复选框。
问题是我在 GUI 中看不到它(第一个负载保持在那里,并且只要我手动单击每个复选框就会改变)

我应该以某种方式“刷新”GUI吗?
谢谢。

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>

测试.cs:
class Test
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

最佳答案

ObservableCollection 只会在您添加或删除项目时引发 OnPropertyChanged 事件。如果您希望 UI 在更改 IsChecked 属性时更新,则 Class Test 需要在 IsChecked 更改时引发 OnPropertyChanged 事件:

class Test
{
    private bool isChecked;
    public bool IsChecked
    {
        get { return this.isChecked; }
        set
        {
            this.isChecked= value;
            this.OnPropertyChanged("IsChecked");
        }
    }
}

关于c# - WPF:使用 MVVM 的 SelectAll\UnSelectAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220220/

相关文章:

.net - 在 WPF 中设置控件内容比将类绑定(bind)到选择器控件更好的方法是什么?

c# - WPF 共享资源问题 - 没有 App.xaml,没有共享资源

c# - MVVM-处理后备数据

c# - 如何将转换器应用于 ObservableCollection 的每个项目?

android - 将类注入(inject)服务

c# - 如何将自定义模型对象从 Razor View 传递到 ASP.NET MVC 5 中的 Controller 操作

c# - 日期时间转换异常

c# - .Net 配置 - 如何覆盖映射配置文件中的设置和自定义部分?

c# - 事件参数——它们应该反射(reflect)事件发生时的状态快照还是实时数据?

c# - IValueConverter 的最佳实践是什么?