如何在DataGridTextColumn自定义控件中创建IList Dep属性

时间:2018-07-12 03:16:51

标签: wpf custom-controls dependency-properties listobject

我想将列表对象传递给我的datagrid DataGridTextColumn的自定义控件。 为此,我使用了这段代码

public class DataGridListBoxColumn : DataGridTextColumn
{
public IList<Student> ListItems
{
get { return (IList<Student>)GetValue(_ListItems); }
set { SetValue(_ListItems, value); }
}
public static readonly DependencyProperty _ListItems = DependencyProperty.Register("ListItems", typeof(IList<Student>), typeof(DataGridListBoxColumn));  
}

我XAML

 <local:DataGridListBoxColumn   Binding="{Binding M_Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" ListItems="{Binding Path= stud, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"  Width="100"/>

OR

<local:DataGridListBoxColumn   Binding="{Binding M_Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" ListItems="{Binding RelativeSource={RelativeSource AncestorType=DataGridTextColumn}, Path=stud}"  Width="100"/>

两者都不起作用,是否有任何方法可以将列表传递给我的自定义控件 谢谢

1 个答案:

答案 0 :(得分:0)

DataGrid列的问题在于,它们在视觉或逻辑树中不存在,因此您不能使用RelativeSource。可能性也有限制,那就是为Source的绑定设置x:Reference。限制是,您不能将其设置为包含绑定元素的源UIElement。因此,您无法设置主窗口或数据网格,后者将列作为绑定的源,否则您将获得周期性依赖关系。
现在在您的DataGrid旁边放置一个隐藏的控件来访问数据,或使用一些现有的控件:

<TextBlock x:Name="studAccess" Visibility="Collapsed"/>
<DataGrid>
<local:DataGridListBoxColumn .../>
</DataGrid>

并通过此控件绑定列的依赖项属性(即DataContext的{​​{1}}具有studAccess属性):

stud