C# 无外观控件';s ItemTemplatePanel无法查看控件上的依赖项属性

C# 无外观控件';s ItemTemplatePanel无法查看控件上的依赖项属性,c#,uwp,uwp-xaml,C#,Uwp,Uwp Xaml,因此,当我使用下面的样式时,它将按预期应用于我的控件。但是,GridView(ItemsPanelTemplate和ItemsTemplate)中的模板查看消费者为其数据上下文应用的视图模型 问题是我想在控件中设置项维度 因此,我的问题是,如何将控件模板作为数据上下文应用于ItemsPanelTemplate和ItemTemplate 我的第一个想法是使用祖先绑定,但这似乎不是UWP的一个特性 我的控制班 public class FilterableImageWrapGrid : Filter

因此,当我使用下面的样式时,它将按预期应用于我的控件。但是,
GridView
ItemsPanelTemplate
ItemsTemplate
)中的模板查看消费者为其数据上下文应用的视图模型

问题是我想在控件中设置项维度

因此,我的问题是,如何将控件模板作为数据上下文应用于
ItemsPanelTemplate
ItemTemplate

我的第一个想法是使用祖先绑定,但这似乎不是UWP的一个特性

我的控制班

public class FilterableImageWrapGrid : FilterableContentList
    {
        private GridView _partGridView;

        public Point ItemDimensions
        {
            get { return (Point)GetValue(ItemDimensionsProperty); }
            set { SetValue(ItemDimensionsProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ItemDimensions.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemDimensionsProperty =
            DependencyProperty.Register("ItemDimensions", typeof(Point), typeof(FilterableImageWrapGrid), new PropertyMetadata(new Point()));

        public FilterableImageWrapGrid()
        {
            DefaultStyleKey = typeof(FilterableImageWrapGrid);
        }

        protected override void OnApplyTemplate()
        {
            _partGridView = GetTemplateChild("PART_FilterableImageList") as GridView;           

            base.OnApplyTemplate();
        }

        private static void OnItemDimensionsChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            FilterableImageWrapGrid wrapGrid = sender as FilterableImageWrapGrid;

            if (wrapGrid != null && wrapGrid._partGridView != null)
            {
                wrapGrid._partGridView.ItemTemplate.SetValue(GridViewItem.WidthProperty, wrapGrid.ItemDimensions.X);
                wrapGrid._partGridView.ItemTemplate.SetValue(GridViewItem.HeightProperty, wrapGrid.ItemDimensions.Y);
            }
        }
    }
我的Generic.xaml文件中的我的样式

 <Style TargetType="controls:FilterableImageWrapGrid">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>                   
                    <Grid VerticalAlignment="Stretch">                        
                        <GridView                                   
                            x:Name="PART_FilterableImageList"
                            ItemsSource="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FilteredItems, Mode=TwoWay}"
                            SelectedItem="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=SelectedContentItem, Mode=TwoWay}">
                            <GridView.ItemContainerTransitions>
                                <TransitionCollection>
                                    <EntranceThemeTransition  IsStaggeringEnabled="True"/>
                                    <AddDeleteThemeTransition />
                                    <EdgeUIThemeTransition Edge="Left"/>
                                </TransitionCollection>
                            </GridView.ItemContainerTransitions>
                            <GridView.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <ItemsWrapGrid 
                                        x:Name="PART_ItemsWrapGrid"
                                        ItemHeight="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ItemDimensions.Y}"
                                        ItemWidth="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ItemDimensions.X}"
                                        Margin="2" Orientation="Horizontal" 
                                        HorizontalAlignment="Center"/>
                                </ItemsPanelTemplate>
                            </GridView.ItemsPanel>
                            <GridView.ItemTemplate>
                                <DataTemplate>
                                   .... Data template that binds to the view model the consumer provides....
                                </DataTemplate>
                            </GridView.ItemTemplate>
                        </GridView>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

.... 绑定到使用者提供的视图模型的数据模板。。。。

如果我理解正确,在模板中的模板中绑定
RelativeSource Mode=TemplatedParent
是不起作用的。是这样吗

然后将
ItemDimensions
属性定义为附加的依赖项属性:

public class FilterableImageWrapGrid : FilterableContentList

    public static Point GetItemDimensions(DependencyObject obj)
    {
        return (Point)obj.GetValue(ItemDimensionsProperty);
    }

    public static void SetItemDimensions(DependencyObject obj, Point value)
    {
        obj.SetValue(ItemDimensionsProperty, value);
    }

    public static readonly DependencyProperty ItemDimensionsProperty =
        DependencyProperty.RegisterAttached("ItemDimensions", typeof(Point), typeof(ItemsWrapGrid), new PropertyMetadata(new Point()));

    ...
}
然后将其添加到模板中:

                     <GridView                                   
                            x:Name="PART_FilterableImageList"
                            ...
                            <GridView.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <ItemsWrapGrid 
                                        x:Name="PART_ItemsWrapGrid"                                        
                                        ItemHeight="{Binding RelativeSource=
                                 {RelativeSource Mode=Self}, Path=ItemDimensions.Y}"
                                        ItemWidth="{Binding RelativeSource=
                                 {RelativeSource Mode=Self}, Path=ItemDimensions.X}"
                                        Margin="2" Orientation="Horizontal" 
                                        HorizontalAlignment="Center"/>
                                </ItemsPanelTemplate>
                            </GridView.ItemsPanel>
                            ...
                        </GridView>

谢谢你的回答。我没有忘记你。今晚回家后我会试试,如果成功了就告诉你。我不想为这个控件创建另一个子类。我希望有一个更干净的解决方案。我的答案之前与我的第一个想法和最后的编辑相混淆,我再次编辑了它。。。现在请看一下。不需要子类化。。。