名单的“隐藏”部分(“Hiding” part of List)

2019-10-19 02:07发布

任务:

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

Answer 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());
    }
}


Answer 2:

我建议你看看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 );
}

这里的一个很好的例子。



Answer 3:

有很多不同的方法来做到这一点,一个方法是用数据触发器。 首先为您的列表中的每个元素的模型,并提供一个“隐藏”属性:

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>

但是就像我说的,有很多其他的方法来做到这一点也如转换器,附加属性等。



文章来源: “Hiding” part of List
标签: c# wpf csla