【问题标题】:Silverlight ListBox with ObservableCollection<T> and dynamic filter带有 ObservableCollection<T> 和动态过滤器的 Silverlight ListBox
【发布时间】:2011-04-13 12:39:07
【问题描述】:

假设我有这门课:

public class MyData
{
    public bool IsActive{get;set;}
    public String Data1 {get;set;}
    public String Data2 {get;set;}
}

还有一个

ObservableCollection<MyData> data = new ObservableCollection<MyData>;
ListBox.ItemsSource = data;

按预期将项目添加到 ObservableCollectionworks;但是,我想确保我的列表框仅显示 IsActive 设置为“true”的项目——我不能使用 Linq 查询来设置 ItemsSource,因为它不是 ObservableCollection,它的 IEnumerable 并且不这样做列表框的任何更新通知。

【问题讨论】:

    标签: c# wpf silverlight data-binding windows-phone-7


    【解决方案1】:

    您的答案是 CollectionViewSource。不是绑定到列表,而是绑定到 CollectionViewSource 的实例。

    下面是一个稍微退化的示例(我不确定您是否使用 ViewModel、定位器等来解析您的数据和列表。)

    假设在您的标记中,您的资源中声明了一个 CollectionViewSource,如下所示:

    <phone:PhoneApplicationPage.Resources>
        <CollectionViewSource x:Key="src"/>
    </phone:PhoneApplicationPage.Resources>
    

    那么你的列表绑定看起来像:

    <ListBox x:Name="MyListBox" ItemsSource="{Binding Source={StaticResource src}}">
    

    最后,在代码中你可以将你的列表和你的集合视图源结合起来:

            var collectionView = this.Resources["src"] as CollectionViewSource;
            // Check for null, etc.
            collectionView.Source = observableCollectionThatIAmBindingTo;
            collectionView.View.Filter=new Predicate<Object>(o => ((ItemType)o).IsActive );
    

    此外,您可能还想查看 Bea Stollnitz 关于该主题的文章:

    http://bea.stollnitz.com/blog/?p=31

    http://bea.stollnitz.com/blog/?p=392

    【讨论】:

    • 这会编译,但它不显示我的任何项目(我验证集合中有 IsActive=True 和 IsActive=False)关于尝试什么有什么想法吗?
    • 它似乎在没有 View.Filter 部分的情况下工作。虽然谓词似乎没问题...
    【解决方案2】:

    更简单的方法是在 XAML 中使用 Visibility

    假设您的 ListBox ItemTemplate 使用 StackPanel 来保存您的数据,在这种情况下,您在此 StackPanel 中有 2 个 TextBlock(1 个用于 Data1,1 个用于 Data2)。

    所以你应该把这个StackPanelVisibility绑定到IsActive

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多