我有一个XAML代码段,如下所示:
<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
<Grid>
/// Stuff
</Grid>
<GridView x:Name="MyGrid" />
</DataTemplate>
</UserControl.Resources>
<ns:MyObject x:Name="MyLovelyObject" />
现在,我想要一个指向“MyGrid”的指针。但是,由于WPF的内在设计,不可能在代码级别轻松访问“MyGrid”。所以,我正在寻找替代方案。以下是我想要做的但是不能完全解决语法问题(注意:GridView是MyObject的公共属性):
<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
<Grid>
/// Stuff
</Grid>
<GridView Binding="{Path=GridView}" />
</DataTemplate>
<GridView x:Key="GridViewTemplate">
/// Lots of stuff
</GridView>
</UserControl.Resources>
<ns:MyObject x:Name="MyLovelyObject" GridView="{Binding GridViewTemplate}" />
无论如何,这显然无法解决。基本上看起来我对XAML有两个目标: 1.使用DataTemplate创建MyObject 2.使用另一个DataTemplate初始化MyObject.GridView(注意:GridView是一个GUI对象)
关于此的任何输入?
感谢。
答案 0 :(得分:0)
我不是百分百肯定你在代码中做了什么,但我会尽我所能。
首先,DataTemplates仅用于告诉WPF如何绘制对象。它们不是将自己呈现的实际UI对象。
DataTemplates有两种类型:隐式和显式。
隐式DataTemplates没有x:Key
字段,并且在WPF用于呈现指定DataType的对象时自动使用。
例如,您的第一个代码块中有<DataTemplate DataType="{x:Type ns:MyObject}">
,因此WPF将在需要呈现ns:MyObject
类型的对象时随时使用此模板
显式DataTemplates为它们定义了x:Key
,并且必须在要使用它们的XAML中明确定义。例如,如果您有<DataTemplate x:Key="CustomNsObjectTemplate">
,则可以将其应用于您的对象,例如<ns:MyObject Template="{StaticResource CustomNsObjectTemplate}" />
其次,如果GridView
对象是UI对象,则应使用ContentControl
来显示它,而不是尝试使用其他GridView
。像
<ContentControl Content="{Binding GridView}" />
现在我怀疑你要做的是通过将GridView
中的GridView
传递到UserControl.Resources
属性,在DataTemplate中使用自定义GridView
对象你MyObject
班的。
如果是这种情况,您需要在GridView
中创建<UserControl.Resources>
UI对象,并使用{Static Resource }
MyObject
绑定将其传递给您的对象}定义。
您还需要切换GridView
中DataTemplate
从GridView
到ContentControl
的显示方式,您可能希望将两者都包含在内您的Grid
和GridView
位于单个父级控件中,例如StackPanel
,否则您将获得例外。
所以你的结束代码可能如下所示:
<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
<StackPanel>
<Grid>
/// Stuff
</Grid>
<ContentControl Content="{Binding Path=GridView}" />
</StackPanel>
</DataTemplate>
<GridView x:Key="MyCustomGridView">
/// Lots of stuff
</GridView>
</UserControl.Resources>
<ns:MyObject GridView="{StaticResource MyCustomGridView}" />