任务:
我想隐藏我的CSLA的childList,但没有在我的数据库使用任何额外列的一部分。 (如可见?真/假)
例如:我有所有成员的列表。 进出口设置一个过滤器,让我只看到成员编号为3。现在我可以编辑filterd列表。 去除过滤器后,我可以看到再次在整个列表和编辑的成员没有动作之间保存。
林具有两个列表结束了。 一个是filtert和所有成员之一。 也许有一些命令,我不知道吗?
码:
private int _selectedGroup;
public int SelectedGroup
{
get
{
return _selectedGroup;
}
set
{
if (_selectedGroup!= value)
{
_selectedGroup= value;
OnPropertyChanged(() => SelectedGroup);
FilterByGroup();
}
}
}
调用改变numner过滤后的过滤法。
private void FilterByProduktgrp()
{
// List All
List = Model.ChildList;
//Filtered List
List = List.Where(c => c.ID == FilterID);
}
现在我需要编辑的名单到Model.ChildList
正如马克说,有很多方法可以实现你的目标。 通过你的代码来看,到目前为止,你似乎是从同样的方式,我会处理这个问题。 这种方法是......基本上,你需要将永远持有项目的完整集合一个私人收藏性质。 然后,你需要另一个公共集合属性绑定到一些UI容器控制数据。
在您的视图模型的初始化,获取数据,并填写你的私人收藏。 这将被用来填充数据绑定集合取决于你选择的任何过滤性能。 你甚至可以建立这个过滤过程进入过滤器的属性设置,如果你喜欢:
public YourDataType SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem");
FilteredCollection = new ObservableCollection<YourDataType>(
PrivateCollection.Where(i = i.SomeProperty == selectedItem.AnotherProperty).ToList());
}
}
我建议你看看CollectionViewSource ,让你排序,过滤,分组等。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ListBox ItemsSource={Binding Customers} />
</Window>
public class CustomerView
{
public CustomerView()
{
DataContext = new CustomerViewModel();
}
}
public class CustomerViewModel
{
private ICollectionView _customerView;
public ICollectionView Customers
{
get { return _customerView; }
}
public CustomerViewModel()
{
IList<Customer> customers = GetCustomers();
_customerView = CollectionViewSource.GetDefaultView(customers);
}
}*
为了筛选集合视图,您可以定义确定的项目应是视图与否的一部分的回调方法。 这种方法应具有以下特征:布尔过滤器(对象的项目)。 现在设置方法为的CollectionView的Filter属性的委托,就大功告成了。
ICollectionView _customerView = CollectionViewSource.GetDefaultView(customers);
_customerView.Filter = CustomerFilter
private bool CustomerFilter(object item)
{
Customer customer = item as Customer;
return customer.Name.Contains( _filterString );
}
这里的一个很好的例子。
有很多不同的方法来做到这一点,一个方法是用数据触发器。 首先为您的列表中的每个元素的模型,并提供一个“隐藏”属性:
public class Model
{
public string Text { get; set; }
public bool Hidden { get; set; }
}
然后创建列表,并与您的项目控件绑定:
theListBox.ItemsSource = new Model[] {
new Model{Text="One", Hidden=false},
new Model{Text="Two", Hidden=true},
new Model{Text="Three", Hidden=false}
};
最后覆盖ListBoxItem的样式列表框,并使用数据触发隐藏已隐藏设置为true的任何元素:
<ListBox Name="theListBox" DisplayMemberPath="Text">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Hidden}" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Resources>
</ListBox>
但是就像我说的,有很多其他的方法来做到这一点也如转换器,附加属性等。