我已将数据网格和一堆复选框绑定到视图模型中的以下属性(键入 Presenter )。
public ListCollectionView AllOrdersView { get; set; }
public IEnumerable<CarrierType> AllCarrierTypes
{
get { return _allCarrierTypes; }
set
{
_allCarrierTypes = value;
OnPropertyChanged();
}
}
在它的构造函数中,我指定了一个类似的过滤器。
public Presenter()
{
_allOrders = new ObservableCollection<Order>(DataAccessor.GetOrders());
AllOrdersView = new ListCollectionView(_allOrders);
AllOrdersView.Filter = element => AllCarrierTypes
.Where(x => x.Active).Contains(((Order)element).CarrierType);
}
目的是过滤掉具有未选中类型的承运人的订单。目前,似乎最初只在调用构造函数时才进行过滤。我的希望是,由于复选框已绑定,我不需要进一步干预代码。事实并非如此。在选中/取消选中复选框时,数据网格不受影响。
此外,怀疑它与刷新视图的需要有关,我添加了对视图的调用,如下所示。
private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs)
{
((Presenter)DataContext).AllOrdersView.Refresh();
}
可悲的是,这似乎没有任何区别,我被困住了。所以,我的问题是这些。
我的绑定以下列方式完成。
<ListBox ItemsSource="{Binding AllCarrierTypes}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}"
IsChecked="{Binding Active,Mode=TwoWay}"
Checked="ToggleButton_OnChecked"
Unchecked="ToggleButton_OnUnchecked"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding AllOrdersView}"
AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" .../>
每个请求 - 模型中 CarrierType 类的完整版本。
public class CarrierType : INotifyPropertyChanged
{
private bool _active;
public int Id { get; set; }
public String Name { get; set; }
public bool Active
{
get { return _active; }
set
{
_active = value;
OnPropertyChanged();
}
}
public override String ToString()
{
return Name;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 0 :(得分:1)
.NET 4.5中的 ListCollectionView 似乎存在问题(不确定之前是否存在问题)。您需要调用 Refresh(),但它似乎不起作用。
我所做的是重新分配过滤器。
private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs)
{
AllOrdersView.Filter = element => AllCarrierTypes
.Where(x => x.Active).Contains(((Order)element).CarrierType);
}
根据以下评论的要求:
<CheckBox IsChecked="{Binding Active,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>