“隐藏”List的一部分

时间:2013-12-02 10:34:38

标签: c# wpf csla

任务:

我想要隐藏我的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

3 个答案:

答案 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 );
}

A good example here.

答案 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>

但正如我所说,还有很多其他方法可以做到这一点,例如:转换器,附加属性等。