我有一个自定义下拉控件添加到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);