WPF将DataGrid绑定到CollectionViewSource:通过DataContext工作,通过ItemsSource清空;区别?
考虑以下XAML: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
<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代码,看看它们在什么情况下进行值转换。