【发布时间】: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