【问题标题】:WPF: SelectAll \ UnSelectAll with MVVMWPF:使用 MVVM 的 SelectAll \ UnSelectAll
【发布时间】:2019-03-18 11:21:47
【问题描述】:

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

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

我为 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>

Test.cs:

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

【问题讨论】:

  • ObservableCollection 只会在您添加或删除项目时引发 OnPropertyChanged 事件。如果您在更改 IsChecked 属性时想要一个,您也需要在其中添加它。
  • 为 IsChecked 和 Name 属性实现 OnPropertyChanged

标签: c# wpf mvvm


【解决方案1】:

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

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

【讨论】:

  • 哦,知道了。谢谢!!
【解决方案2】:

如果你不想改变模型并添加 OnPropertyChanged,你可以这样做:

_basicTests = new ObservableCollection(_basicTests.ForEach(bt => bt.IsChecked = true));

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2020-11-28
    • 2020-10-23
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多