当在ListView的GridViewColumn的DataTemplate中将其设置为X:type时,依赖属性的GetValue返回null

时间:2019-06-24 20:48:55

标签: c# wpf

我有一个自定义下拉控件添加到ListView中的每个项目。提供给下拉菜单的项目列表是一个集合对象,该对象继承自ObservableCollection <>。集合对象的自定义控件上有一个依赖项属性。当绑定到x:Type时,它在ListView中无法获取GetValue()。在用户控件中时,它不会失败。

我可以通过绑定到ViewModel中的Type来解决此问题。

列出视图标题并查看GridViewColumn包含在以下位置:

<ListView x:Name="InventoryTrackingEntryListView" ItemsSource="{Binding View.Inventory_Items}"
    <ListView.View>
        <GridView ColumnHeaderContainerStyle="{StaticResource SBTGridViewColumHeaderStyle}">
        </GridView>
    </ListView.View>
</ListView>

这在列表视图中有效。我绑定到一个名为CollectionType的Type属性。

<GridViewColumn Header="Kardex Bin" admin:ListViewSorter.SortBindingMember="KardexBinId">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <admin:ActiveDDLControl Margin="5" d:DataContext="{d:DesignInstance model:Physical_Tracking}" MinWidth="50"
                                    admin:ActiveDDL.CollectionType="{Binding CollectionType}"
                                    admin:ActiveDDL.ValueId="{Binding KardexBinId, Mode=TwoWay}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

这不适用于列表视图。自定义控件ActiveDDLControl确实可以在使用x:Type的用户控件中工作。

<GridViewColumn Header="Kardex Bin" admin:ListViewSorter.SortBindingMember="KardexBinId">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <admin:ActiveDDLControl Margin="5" d:DataContext="{d:DesignInstance model:Physical_Tracking}" MinWidth="50"
                                    admin:ActiveDDL.CollectionType="{x:Type model:IKardexBin}"
                                    admin:ActiveDDL.ValueId="{Binding KardexBinId, Mode=TwoWay}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

这是ActiveDDLControl在用户控件中的外观,并且可以正常工作

<admin:ActiveDDLControl Grid.Row="19" Grid.Column="7" Margin="5" IsEnabled="{Binding ElementName=IsWriteOnly, Path=IsChecked}"
                        admin:ActiveDDL.CollectionType="{x:Type model:IKardexBin}"
                        admin:ActiveDDL.ValueId="{Binding KardexBinId, Mode=TwoWay}"/>

依赖项属性设置

CollectionTypeProperty = DependencyProperty.RegisterAttached("CollectionType",
     typeof(Type), typeof(ActiveDDL), new FrameworkPropertyMetadata(null, OnCollectionTypePropertyChanged));

public static object GetCollectionType(DependencyObject d) => d.GetValue(CollectionTypeProperty);

0 个答案:

没有答案