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将DataGrid绑定到CollectionViewSource:通过DataContext工作,通过ItemsSource清空;区别?_Wpf_Data Binding_Datagrid_Datacontext_Itemssource - Fatal编程技术网

WPF将DataGrid绑定到CollectionViewSource:通过DataContext工作,通过ItemsSource清空;区别?

WPF将DataGrid绑定到CollectionViewSource:通过DataContext工作,通过ItemsSource清空;区别?,wpf,data-binding,datagrid,datacontext,itemssource,Wpf,Data Binding,Datagrid,Datacontext,Itemssource,考虑以下XAML: <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:WpfApplication1" DataContext="{B

考虑以下XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:WpfApplication1"
    DataContext="{Binding Source={x:Static c:ViewModel.Instance}}"
    >
<Grid>
    <DataGrid DataContext="{Binding ItemsViewSource}" ItemsSource="{Binding}" />

</Grid>

以及视图模型:

public class ItemViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class ViewModel
{
    public static ViewModel Instance { get; set; }

    static ViewModel()
    {
        Instance = new ViewModel();
    }

    public ObservableCollection<ItemViewModel> Items { get; private set; }
    public CollectionViewSource ItemsViewSource { get; private set; }

    public ViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>();
        ItemsViewSource = new CollectionViewSource() { Source = Items };
        Items.Add(new ItemViewModel() { FirstName = "test", LastName = "test" });
    }
}
公共类ItemViewModel
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共类视图模型
{
公共静态ViewModel实例{get;set;}
静态视图模型()
{
实例=新的ViewModel();
}
公共可观测集合项{get;private set;}
public CollectionViewSource项目查看源{get;private set;}
公共视图模型()
{
Items=新的ObservableCollection();
ItemsViewSource=newcollectionviewsource(){Source=Items};
添加(新的ItemViewModel(){FirstName=“test”,LastName=“test”});
}
}
此代码正在运行,但如果我更改

<DataGrid DataContext="{Binding ItemsViewSource}" ItemsSource="{Binding}" />

`
DataGrid未绑定,它是空的


这两个绑定之间有什么区别?

首先,要使用第二个选项,您需要使用
CollectionViewSource.View
属性进行绑定

<DataGrid ItemsSource="{Binding ItemsViewSource.View}" />


当您将dataGrid的DataContext绑定到CollectionViewSource时,dataGrid在内部执行从CollectionViewSource到ICollectionView的值转换(在您的示例中为ListCollectionView)但当您明确要求它绑定到CollectionViewSource时,它不会执行默认值转换。您可以通过将转换器放入绑定来验证这一点。

首先,要使第二个选项正常工作,您需要使用
CollectionViewSource.View
属性进行绑定

<DataGrid ItemsSource="{Binding ItemsViewSource.View}" />


当您将dataGrid的DataContext绑定到CollectionViewSource时,dataGrid在内部执行从CollectionViewSource到ICollectionView的值转换(在您的示例中为ListCollectionView)但当您明确要求它绑定到CollectionViewSource时,它不会执行默认值转换。您可以通过将转换器放入绑定中来验证这一点。

那么,如果我像这样将
ItemsSource
绑定到
CollectionViewSource
ItemsSource=“{binding Source={StaticResource cvsTasks}}”
(其中cvsTasks是
CollectionViewSource
的实例,请参见中的示例),它也可以工作吗?也就是说,为什么有时DataGrid会从CollectionViewSource到ICollectionView进行值转换,有时则不会?是的,我知道DataGrid当时也会进行值转换。第二个原因是,您必须通过反射来查看WPF代码,它们在什么情况下进行值转换。那么,如果我将
ItemsSource
绑定到
CollectionViewSource
像这样:
ItemsSource=“{Binding Source={StaticResource cvsTasks}”
(其中cvsTasks是
CollectionViewSource
的实例-请参阅中的示例),它也可以工作?也就是说,为什么有时候DataGrid从CollectionViewSource到ICollectionView进行值转换,有时候不行?是的,我知道DataGrid当时也会进行值转换。第二个原因是,您必须通过反射查看WPF代码,看看它们在什么情况下进行值转换。