相关疑难解决方法(0)

我应该绑定到ICollectionView或ObservableCollection

应该绑DataGrid一个

ICollectionView = CollectionViewSource.GetDefaultView(collection)

或者

ObservableCollection<T> collection; ???

MVVM的最佳实践是什么?为什么?

.net c# data-binding wpf mvvm

79
推荐指数
4
解决办法
4万
查看次数

实现ICollectionViewLiveShaping

任何人都可以帮我正确实现ICollectionViewLiveShaping过滤目的吗?关于这个问题,我没有在网上找到很多有用的文档.这就是我所拥有的:

public ICollectionView WorkersEmployed { get; set; }

WorkersEmployed = new CollectionViewSource { Source = GameContainer.Game.Workers }.View;
Run Code Online (Sandbox Code Playgroud)

我没有使用,GetDefaultView因为我需要在此集合上有多个过滤器实例.如果重要,那GameContainer.Game.Workers就是ObservableCollection.

ApplyFilter(WorkersEmployed);

private void ApplyFilter(ICollectionView collectionView)
{
    collectionView.Filter = IsWorkerEmployed;
}

public bool IsWorkerEmployed(object item)
{
    Worker w = item as Worker;
    return w.EmployerID == this.ID;
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效,但当然必须手动刷新,这就是我尝试使用的原因ICollectionViewLiveShaping.我能找到的最好的例子就是这个,但不幸的是我仍然无法让它发挥作用.鉴于我在这里有什么,任何人都可以给我一个正确的方向,让实时过滤工作?

任何帮助将不胜感激.

出于好奇,这真的是一项艰巨的任务吗?如果是这样的话,设计人员似乎ICollectionViewLiveShaping做得很糟糕.

更新:看来,只有这样,才能增加一个属性LiveFilteringPropertiesICollectionViewLiveShaping通过字符串收集.鉴于这种限制,是否可以按另一个类中的属性进行过滤(在本例中为Workers'EmployerID)?

任何有经验的人都能GetDefaultView告诉我,在这种情况下我想做什么甚至是一个可行的选择吗?老实说我不知道​​是不是因为缺乏文档和可用的例子.即使这是不可行的,也至少知道我是否在浪费时间.

c# icollectionview

13
推荐指数
1
解决办法
4758
查看次数

更改Source时,CollectionViewSource Filter不会刷新

我有一个绑定到CollectionViewSource的WPF ListView.它的源绑定到一个属性,如果用户选择一个选项,该属性可能会更改.

当列表视图源由于属性更改事件而更新时,所有内容都会正确更新,但视图不会刷新以考虑CollectionViewSource过滤器中的任何更改.

如果我将一个处理程序附加到Source属性绑定的Changed事件,我可以刷新视图,但这仍然是旧视图,因为绑定尚未更新列表.

有什么好的方法可以在源更改时刷新视图并重新评估过滤器?

干杯

collections wpf filter

12
推荐指数
2
解决办法
2万
查看次数

可观察的CollectionViewSource

我正在尝试设置一个ListBox,从CollectionViewSource获取它的数据.我想要发生的是,当我更新底层数据源时,ListBox也会更新.我的Xaml看起来像这样......

<Window.Resources>
    <ObjectDataProvider x:Key="AppTests" ObjectType="{x:Type Application:AppTestProvider}" MethodName="GetAppTests" />
    <CollectionViewSource x:Key="cvs" Source="{StaticResource AppTests}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Priority" Direction="Ascending" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Window.Resources>

<Grid>
    <ListBox x:Name="TestList" ItemsSource="{Binding Source={StaticResource cvs}}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding TestName}" />                    
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)

这显示数据正常,但如果我更改基础数据,那么在我cvs.View.Refresh()在后面的代码中调用方法之前,更改不会出现在网格上.

如何让这个"可观察",以便自动发生变化?

注意:使用CVS的原因是基于底层对象中的属性为列表提供排序.

.net c# data-binding wpf xaml

3
推荐指数
1
解决办法
1928
查看次数

标签 统计

c# ×3

wpf ×3

.net ×2

data-binding ×2

collections ×1

filter ×1

icollectionview ×1

mvvm ×1

xaml ×1