重绘框后,从列表框中保留所选项目

时间:2015-02-09 22:03:54

标签: c# wpf mvvm devexpress

我有一个开发快递(MVVM)复选框 - 列表框编辑(使用Caliburn Micro),它允许我尝试附加搜索功能的多个选项,它正在按预期工作,但是当我选择了项目时,然后搜索,之前选择的项目将丢失。继承我的XAML:

<layout:LayoutItem Label="label : " Foreground="White" LabelPosition="Top">
            <DockPanel>
                <TextBox Text="{Binding Path=SeachItems, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top" Width="400">
                </TextBox>

                <dxe:ListBoxEdit DockPanel.Dock="Bottom" Foreground="Black" Margin="10" Width="400" DisplayMember="Name" MaxHeight="200" MinHeight="200" ItemsSource="{Binding Path=Items}" EditValue="{Binding Path=SelectedItems}" SelectionMode="Multiple" >
                    <dxe:ListBoxEdit.StyleSettings>
                        <dxe:CheckedListBoxEditStyleSettings />
                    </dxe:ListBoxEdit.StyleSettings>
                </dxe:ListBoxEdit>
            </DockPanel>
        </layout:LayoutItem>

列表框的声明(我认为这可能是我的问题的一部分,因为我无法找到将我的选择绑定到ObservableCollection的方法,我似乎只能将它们绑定到通用列表):

public ObservableCollection<Items> Items { get; set; }
public List<object> SelectedItems { get; set; } 

这是我的搜索方法:

private string _searchItems;
public string SeachItems
    {
        get { return _searchItems; }
        set
        {
            _searchItems = value;
            var tempItems = SelectedItems;
            var items = //fetch all items from collection;
            Items = (from p in items where p.Name.ToLower().StartsWith(SeachItems.ToLower()) orderby p.Name select p).ToObservableCollection();

            NotifyOfPropertyChange(()=>Items);
            SelectedItems = tempItems;
            NotifyOfPropertyChange(()=>SelectedItems);

        }
    }

尽管SelectedItems确实在调用NotifyOfPropertyChange()时有效,但在查看实际列表框时,没有检查任何项目,下一次搜索会清除SelectedItems任何指针吗?

编辑:

在设置模型中,我填充Items并创建SelectedItems的实例

Items = //populate observable collection from database
SelectedItems = new List<object>();

2 个答案:

答案 0 :(得分:0)

您应该使用CollectionViewSource过滤项目。 Here就是一个例子。 非常基本:

ICollectionView myCollectionVIew = CollectionViewSource.GetDefaultView(items);
myCollectionVIew.Filter = p => { return  p.Name.ToLower().StartsWith(SeachItems.ToLower();   };

答案 1 :(得分:0)

您可以简单地绑定选定的值。重绘时,值将相同。

<dxe:ListBoxEdit DockPanel.Dock="Bottom" Foreground="Black" Margin="10" 
                  Width="400" DisplayMember="Name" MaxHeight="200" MinHeight="200" 
                  ItemsSource="{Binding Path=Items}" 
                  EditValue="{Binding Path=SelectedItems}"
                  SelectionMode="Multiple" 
                  SelectedItem = {"Binding myNewVar"}>