将itemssource交给从datagrid派生的自定义控件

时间:2014-05-08 23:31:24

标签: c# wpf datagrid custom-controls .net-4.5

我在.NET 4.5中使用wpf,我希望有一个数据网格模板嵌入到其他DataTemplates中。我使用DataTemplateSelector来显示公共父类的子列表的内容。

我只想更改DataGrid的ItemsSource,因为它在每个类中都有不同的属性名称。

我的DataGrid模板中的常规绑定可以具有相同的绑定,因为列表始终包含相同的类。

因此,我创建了一个从DataGrid派生的自定义类。在行中它工作得很好,但是当我使用我的自定义类时,我没有在DataGrid中获得任何输出。

那么我怎样才能使我的自定义控件make行为像普通的datagrid一样。我只想在那里更改数据源。

提前致谢。

内联示例工作正常:

<DataGrid ItemsSource="{Binding Path=KnotPoints, Converter={StaticResource geoArrayToDataGrid}}" AutoGenerateColumns="False">
    <DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Path=DataContext.Num, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}"/>
    </DataTemplate>
    </DataGrid.RowHeaderTemplate>
    <DataGrid.Columns>
        <DataGridTextColumn Header="X" Binding="{Binding X}"/>
        <DataGridTextColumn Header="Y" Binding="{Binding Y}"/>
        <DataGridTextColumn Header="Z" Binding="{Binding Z}"/>
    </DataGrid.Columns>
</DataGrid>

Custom UserControl不会返回任何内容:

<DataGrid x:Class="FlexForCFK.CAD.Controls.MultiGeoStruct"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         AutoGenerateColumns="False">
    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=DataContext.Num, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}"/>
        </DataTemplate>
    </DataGrid.RowHeaderTemplate>
    <DataGrid.Columns>
        <DataGridTextColumn Header="X" Binding="{Binding X}"/>
        <DataGridTextColumn Header="Y" Binding="{Binding Y}"/>
        <DataGridTextColumn Header="Z" Binding="{Binding Z}"/>
    </DataGrid.Columns>
</DataGrid>

修改 自定义Control MutliGeoStruct放在代码中:

<TreeViewItem Header="Knot Points" IsExpanded="True">
     <y:MultiGeoStruct ItemsSource="{Binding Path=KnotPoints, Converter={StaticResource geoArrayToDataGrid}}"/>
</TreeViewItem>

(y是我控件的命名空间)

xmlns:y="clr-namespace:FlexForCFK.CAD.Controls"

1 个答案:

答案 0 :(得分:0)

编辑:不是解决方案!

埃尔贡佐是对的。我必须设置

 DataContext="{Binding}"

用于我的MultiGeoStruct DataGrid。

 <y:MultiGeoStruct DataContext="{Binding}" ItemsSource="{Binding Path=KnotPoints, Converter={StaticResource geoArrayToDataGrid}}"/>

解决了这个问题。但那是为什么呢?在我的顶级TreeView中,我根本没有设置DataContext,据我所知,如果你使用ItemSource,Collection直接被赋予Items,而父的DataContext根本不需要任何定义。

所以我只是设置,当我的数据加载到我的TreeView

this.ItemsSource = m;

它运作得很好。

非常感谢你的帮助。

如果你知道答案,请赐教。如果我有解释,我会更新。