Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何正确使用ItemsSource on demand?_Wpf_Datagrid - Fatal编程技术网

Wpf 如何正确使用ItemsSource on demand?

Wpf 如何正确使用ItemsSource on demand?,wpf,datagrid,Wpf,Datagrid,我想将人员列表绑定到DataGrid控件。 对象是按需加载的,这意味着最初我只有一个ID列表(int)。在DataGrid本身中,我需要对象(Person类型)及其所有属性 为此,我使用了一个IValueConverter,它将我的列表转换为列表。 我想将SelectedItem绑定到属性int SelectedId。我不能简单地绑定到Person,因为我的Person类没有ID属性。但是通过值转换,SelectedItem显然是Person类型的 我应该首先将对象加载到字典中,然后将其绑定到I

我想将人员列表绑定到DataGrid控件。 对象是按需加载的,这意味着最初我只有一个ID列表(int)。在DataGrid本身中,我需要对象(Person类型)及其所有属性

为此,我使用了一个IValueConverter,它将我的
列表
转换为
列表
。 我想将SelectedItem绑定到属性
int SelectedId
。我不能简单地绑定到
Person
,因为我的Person类没有ID属性。但是通过值转换,SelectedItem显然是Person类型的

我应该首先将对象加载到字典中,然后将其绑定到ItemsSource。SelectedItem将是一个KeyValuePair


还有哪些方法是可能的?

在列表中提供数据的最佳方法是
可观察集合。我确信这也是一种常见的方式,但我没有证据证明这一点。所以这是一个IMHO声明

它实现了
INotifyCollectionChanged
接口,以便在视图中注意到任何更改(添加和删除项)。有关更多信息,请参阅。如果集合中的项目(在您的案例中为
Person
)正在实现
INotifyPropertyChanged
,则还将通知视图有关项目本身的更改。请查看更多信息

因此,如果我把你放在哪里,我会把一个id属性放入
Person
中,并将整个集合加载到
observedcollection
中。如果您不能修改
Person
,您可以创建一个类似

public class PersonVm
{
    public int Id { get; set; }
    public Person Person { get; set; }

    public PersonVm(int id, Person person)
    {
        Id = id;
        Person = person;
    }
}
如果您想拥有项目的通知功能,您必须自己添加
INotifyPropertyChanged
的实现


顺便说一句,我在这里描述的是MVVM模式的典型实现。用它实现WPF应用程序肯定有很多优点,但也有一些缺点。例如,在较小的项目中,可能存在不值得付出努力的间接费用。你可以得到一个概览。

为此,我使用了一个IValueConverter,它可以将我的列表转换为列表-Uhm wOot?您能添加一些代码,以便我们获得更多详细信息吗?关于你的问题,你的方法有效吗?或者你有什么特别的问题吗?你不能用Lazy吗?请参阅@DHN对不起,我忘记应用代码格式了。现在,我将
字典
用作项源,将
键值对
用作SelectedItem。这种方法是有效的,但我不确定这是否是常见的方法,我更喜欢这种解决方案,因为它遵循常见的MVVM模式。开销是可以管理的,因为ViewModel只是一个包装器。