【发布时间】:2018-04-27 08:37:50
【问题描述】:
我正在使用 MVVM、WPF 并且我有一个弹出窗口;在这个弹出窗口里面是一个列表框,在列表框里面我有一个复选框。问题是:如果我从列表框中取消选中一个项目并单击外部,弹出窗口就会消失;如果我再次单击,复选框将重置为其初始值(所有项目都被选中)。
那么,如何在应用程序运行时保持弹出集的状态并停止其重置?我可以通过 XAML 做到这一点吗?
代码如下:
public class CheckedListItem<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool isChecked = false;
private T item;
public CheckedListItem()
{ }
public CheckedListItem(T item, bool isChecked)
{
this.item = item;
this.isChecked = isChecked;
}
public T Item
{
get { return item; }
set
{
item = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Item"));
}
}
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
}
}
}
视图模型:
private void OnApplyFiltersCommandRaised(object obj)
{
if (FilterElement.Contains("ClassView"))
{
switch (FilterElement)
{
case "buttonClassViewClassFilter":
FilteredClassViewItems.Clear();
FilteredFieldViewItems.Clear();
foreach (var filterItem in FilterItems)
{
if (filterItem.IsChecked == true)
{
FilteredClassViewItems.Add(classViewItems.First(c => c.ClassName == filterItem.Item));
FilteredFieldViewItems.Add(fieldViewItems.First(c => c.ClassName == filterItem.Item));
}
}
break;
...
public ObservableCollection<CheckedListItem<string>> FilterItems
{
get
{
return filterItems;
}
set
{
filterItems = value;
SetPropertyChanged("FilterItems");
}
}
XAML 部分:
<ListBox x:Name="listBoxPopupContent"
Height="250"
ItemsSource="{Binding FilterItems}"
BorderThickness="0"
ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="FontSize" Value="8" />
<Setter Property="IsSelected" Value="{Binding IsChecked, Mode=TwoWay}" />
</Style>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}"
Content="{Binding Item}"
Command="{Binding DataContext.ApplyFiltersCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ListBox}}}"
CommandParameter="{Binding IsChecked,
RelativeSource={RelativeSource Self},
Mode=OneWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
提前致谢!
【问题讨论】:
-
您应该考虑维护作为弹出窗口的 DataContext 的数据状态,而不是 UI 控件的状态。你真的在使用 MVVM 模式吗?
-
@Crowcoder 复选框状态是通过我的viewModel存储的,但是我不知道如何正确维护日期的状态
-
@Nica 这应该可以。关于您的问题(重新打开所有复选框都已选中),您应该观察 FilterItems 与其余代码的交互。如果你不搞乱它,属性 IsChecked 不能单独改变它的状态
-
@DanieleSartori 好的..我在方法中搞砸了(ApplyFilter)..我检查 isChecked 是否为真我相应地填写列..我试图在代码中添加这个: .. 复选框中的所有项目都未选中,但状态仍然没有保持.. 有什么想法吗?
-
@Nica 抱歉,我不明白。你解决了你的问题吗?因为问题已得到解答,并且我解释的方法是保持复选框状态的一种方法。如果您有其他问题,可以打开一个新问题。编辑:你在哪里添加了那个二传手?