如何正确地将 DependencyProperty 绑定到 CollectionViewSource?
How to properly bind a DependencyProperty to a CollectionViewSource?
我是 WPF 初学者,在尝试将依赖项 属性 绑定为 CollectionViewSource
.
的源时遇到问题
用户控件公开了 List
类型的 DependencyProperty
。它用于在 CollectionViewSource
的帮助下在 DataGrid
中呈现数据(使用它进行过滤、分组和排序操作)。
我的MainWindow XAML
:
<Window>
<local:CustomUserControl x:Name="CustomUCDataGrid" ListToDisplay="{Binding listFromDB}"/>
<Window>
我的MainWindow.cs
:
public partial class MainWindow : Window
{
public List<customType> listFromDB{get;set;}
public MainWindow{
listFromDB = GetListFromDB();
InitializeComponent();
this.DataContext = this;
}
}
CustomUserControl.xaml
看起来像:
<UserControl x:Name="ParentNode">
<DataGrid DataContext="{Binding ElementName=ParentNode}">
<StackPanel>
<DataGrid x:Name="DirectDataGrid" ItemSource="{Binding ListToDisplay}"/>
<DataGrid x:Name="DataGridWithCVS" ItemsSource="{Binding cvsList.View}"/>
</StackPanel>
</DataGrid>
</UserControl>
CustomUserControl.xaml.cs
看起来像:
public partial class CustomUserControl: UserControl
{
public List<customType> ListToDisplay{
get { return (List<customType>)GetValue(ListToDisplayProperty); }
set { SetValue(ListToDisplayProperty, value); }
}
public static readonly DependencyProperty ListToDisplayProperty=
DependencyProperty.Register("ListToDisplay", typeof(List<customType>),
typeof(CustomUserControl));
public CollectionViewSource cvsList { get; set; }
public CustomUserControl{
InitializeComponent();
cvsList = new CollectionViewSource();
cvsList.Source = ListToDisplay;
DataGridWithCVS.ItemsSource = CollectionViewSource.GetDefaultView(cvsList);
}
}
此处名称为 "DirectDataGrid" 的 DataGrid 在显示数据时没有问题从 MainWindow 提供给它,但名称为 "DataGridWithCVS" 的 DataGrid 不显示任何数据。调试时找不到任何错误。
我已经尝试过的东西:
- 将 CollectionViewSource 定义为 CustomUserControl 中的 StaticResource XAML - 无法实现此操作,因为 UserControl 不使用 MainWindow 中设置的 DataContext。它使用自己的 DataContext 而不会覆盖 MainWindow 的 DataContext。 (
<UserControl x:Name="ParentNode"> <DataGrid DataContext="{Binding ElementName=ParentNode}">...
).
这只是某种疯狂:)
留下代码。
在你的情况下,除了声明 DependecyProperty 之外,那里应该没有任何东西。
<UserControl x:Name="ParentNode">
<UserControl.Resources>
<CollectionViewSource x:Key="cvsList"
Source="{Binding ListToDisplay, ElementName=ParentNode}"/>
</UserControl.Resources>
<StackPanel>
<DataGrid x:Name="DirectDataGrid" ItemsSource="{Binding ListToDisplay, ElementName=ParentNode}"/>
<DataGrid x:Name="DataGridWithCVS" ItemsSource="{Binding Mode=OneWay, Source={StaticResource cvsList}}"/>
</StackPanel>
</UserControl>
我是 WPF 初学者,在尝试将依赖项 属性 绑定为 CollectionViewSource
.
用户控件公开了 List
类型的 DependencyProperty
。它用于在 CollectionViewSource
的帮助下在 DataGrid
中呈现数据(使用它进行过滤、分组和排序操作)。
我的MainWindow XAML
:
<Window>
<local:CustomUserControl x:Name="CustomUCDataGrid" ListToDisplay="{Binding listFromDB}"/>
<Window>
我的MainWindow.cs
:
public partial class MainWindow : Window
{
public List<customType> listFromDB{get;set;}
public MainWindow{
listFromDB = GetListFromDB();
InitializeComponent();
this.DataContext = this;
}
}
CustomUserControl.xaml
看起来像:
<UserControl x:Name="ParentNode">
<DataGrid DataContext="{Binding ElementName=ParentNode}">
<StackPanel>
<DataGrid x:Name="DirectDataGrid" ItemSource="{Binding ListToDisplay}"/>
<DataGrid x:Name="DataGridWithCVS" ItemsSource="{Binding cvsList.View}"/>
</StackPanel>
</DataGrid>
</UserControl>
CustomUserControl.xaml.cs
看起来像:
public partial class CustomUserControl: UserControl
{
public List<customType> ListToDisplay{
get { return (List<customType>)GetValue(ListToDisplayProperty); }
set { SetValue(ListToDisplayProperty, value); }
}
public static readonly DependencyProperty ListToDisplayProperty=
DependencyProperty.Register("ListToDisplay", typeof(List<customType>),
typeof(CustomUserControl));
public CollectionViewSource cvsList { get; set; }
public CustomUserControl{
InitializeComponent();
cvsList = new CollectionViewSource();
cvsList.Source = ListToDisplay;
DataGridWithCVS.ItemsSource = CollectionViewSource.GetDefaultView(cvsList);
}
}
此处名称为 "DirectDataGrid" 的 DataGrid 在显示数据时没有问题从 MainWindow 提供给它,但名称为 "DataGridWithCVS" 的 DataGrid 不显示任何数据。调试时找不到任何错误。
我已经尝试过的东西:
- 将 CollectionViewSource 定义为 CustomUserControl 中的 StaticResource XAML - 无法实现此操作,因为 UserControl 不使用 MainWindow 中设置的 DataContext。它使用自己的 DataContext 而不会覆盖 MainWindow 的 DataContext。 (
<UserControl x:Name="ParentNode"> <DataGrid DataContext="{Binding ElementName=ParentNode}">...
).
这只是某种疯狂:)
留下代码。
在你的情况下,除了声明 DependecyProperty 之外,那里应该没有任何东西。
<UserControl x:Name="ParentNode">
<UserControl.Resources>
<CollectionViewSource x:Key="cvsList"
Source="{Binding ListToDisplay, ElementName=ParentNode}"/>
</UserControl.Resources>
<StackPanel>
<DataGrid x:Name="DirectDataGrid" ItemsSource="{Binding ListToDisplay, ElementName=ParentNode}"/>
<DataGrid x:Name="DataGridWithCVS" ItemsSource="{Binding Mode=OneWay, Source={StaticResource cvsList}}"/>
</StackPanel>
</UserControl>