WPF 将 DataGrid 绑定到 CollectionViewSource:通过 DataContext 工作,通过 ItemsSource 为空;区别?
WPF binding DataGrid to CollectionViewSource: working via DataContext, empty via ItemsSource; difference?
考虑以下 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" });
}
}
此代码有效,但如果我更改
<DataGrid DataContext="{Binding ItemsViewSource}" ItemsSource="{Binding}" />
到
<DataGrid ItemsSource="{Binding ItemsViewSource}" />`
DataGrid 没有绑定,它是空的。
这两个绑定有什么区别?
首先要使第二个选项起作用,您需要绑定 CollectionViewSource.View
属性。
<DataGrid ItemsSource="{Binding ItemsViewSource.View}" />
当您将 dataGrid 的 DataContext 绑定到 CollectionViewSource 时,dataGrid 在内部执行从 CollectionViewSource 到 ICollectionView(在您的例子中是 ListCollectionView)的值转换 但是当您明确要求它绑定到 CollectionViewSource 时,它不会进行默认值转换。您可以通过将转换器放入绑定中来验证这一点。
考虑以下 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" });
}
}
此代码有效,但如果我更改
<DataGrid DataContext="{Binding ItemsViewSource}" ItemsSource="{Binding}" />
到
<DataGrid ItemsSource="{Binding ItemsViewSource}" />`
DataGrid 没有绑定,它是空的。
这两个绑定有什么区别?
首先要使第二个选项起作用,您需要绑定 CollectionViewSource.View
属性。
<DataGrid ItemsSource="{Binding ItemsViewSource.View}" />
当您将 dataGrid 的 DataContext 绑定到 CollectionViewSource 时,dataGrid 在内部执行从 CollectionViewSource 到 ICollectionView(在您的例子中是 ListCollectionView)的值转换 但是当您明确要求它绑定到 CollectionViewSource 时,它不会进行默认值转换。您可以通过将转换器放入绑定中来验证这一点。