任务:
我想要隐藏我的CSLA ChildList的一部分但不在我的数据库中使用任何额外的列。 (如可见?真/假)
示例: 我有一个所有成员的名单。我设置了一个过滤器,只允许我查看编号为3的成员。现在我可以编辑过滤列表。删除过滤器后,我可以再次看到整个列表和编辑过的成员,而不会在操作之间保存。
我最后有两个列表。一个是filtert,也是所有会员之一。 也许有一些我不知道的命令?
代码:
private int _selectedGroup;
public int SelectedGroup
{
get
{
return _selectedGroup;
}
set
{
if (_selectedGroup!= value)
{
_selectedGroup= value;
OnPropertyChanged(() => SelectedGroup);
FilterByGroup();
}
}
}
将numner更改为filter后调用Filter方法。
private void FilterByProduktgrp()
{
// List All
List = Model.ChildList;
//Filtered List
List = List.Where(c => c.ID == FilterID);
}
现在我需要将已编辑的List放入Model.ChildList
答案 0 :(得分:1)
我建议您查看 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);
}
}*
要过滤集合视图,您可以定义一个回调方法,以确定该项是否应该是视图的一部分。该方法应具有以下签名:bool Filter(对象项)。现在将该方法的委托设置为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 );
}
答案 1 :(得分:1)
正如马克所说,有很多方法可以实现你的目标。到目前为止,根据您的代码判断,您似乎正在以与我相同的方式处理此问题。这就是这个......基本上,你需要一个私有的集合属性,总是保存完整的项目集合。然后,您需要另一个公共集合属性,该属性是绑定到某个UI容器控件的数据。
初始化视图模型后,获取数据并填写您的私人收藏。这将用于填充数据绑定集合,具体取决于您选择的任何过滤器属性。如果您愿意,甚至可以将此过滤过程构建到过滤器属性设置器中:
public YourDataType SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem");
FilteredCollection = new ObservableCollection<YourDataType>(
PrivateCollection.Where(i = i.SomeProperty == selectedItem.AnotherProperty).ToList());
}
}
答案 2 :(得分:0)
有很多不同的方法可以做到这一点,一种方法是使用数据触发器。首先为列表中的每个元素创建一个模型,并提供“隐藏”属性:
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>
但正如我所说,还有很多其他方法可以做到这一点,例如:转换器,附加属性等。