C# WPF从模板对象获取指针
我有一个XAML代码段,如下所示:C# WPF从模板对象获取指针,c#,wpf,xaml,templates,C#,Wpf,Xaml,Templates,我有一个XAML代码段,如下所示: <UserControl.Resources> <DataTemplate DataType="{x:Type ns:MyObject}"> <Grid> /// Stuff </Grid> <GridView x:Name="MyGrid" /> </DataTemplate> </UserControl.Resources> &l
<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
<Grid>
/// Stuff
</Grid>
<GridView x:Name="MyGrid" />
</DataTemplate>
</UserControl.Resources>
<ns:MyObject x:Name="MyLovelyObject" />
<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}" />
///东西
现在,我想要一个指向“MyGrid”的指针。然而,由于WPF的固有设计,不可能在代码级别轻松访问“MyGrid”。所以,我在寻找另一种选择。下面是我想做的事情,但无法完全理解语法(注意:GridView是MyObject的公共属性):
///东西
///很多东西
无论如何,这显然行不通。基本上,我对XAML有两个目标:
1.使用数据模板创建MyObject
2.使用另一个DataTemplate初始化MyObject.GridView(注意:GridView是一个GUI对象)
有什么意见吗
谢谢。我不能100%确定您在代码中做了什么,但我会尽力做到这一点 首先,DataTemplates的存在只是为了告诉WPF如何绘制对象。它们不是一个实际的UI对象,它们将自己呈现 有两种类型的数据模板:隐式和显式 隐式数据模板没有
x:Key
字段,并且在WPF渲染指定数据类型的对象时自动使用
例如,您的第一个代码块中有
,因此WPF将在需要渲染类型为ns:MyObject
显式数据模板有一个为其定义的x:Key
,必须在要使用它们的XAML中显式定义。例如,如果有
,则可以将其应用于对象,如
其次,如果GridView
对象是一个UI对象,那么应该使用ContentControl
来显示它,而不是尝试使用另一个GridView
。差不多
<ContentControl Content="{Binding GridView}" />
是否有任何输入?
是:不要从代码中操作WPF UI元素。如果它们位于模板中,则更少。你想干嘛?谢谢你,瑞秋。这正是我要找的。不幸的是,我无法提高你的投票率,因为我已经被其他人远远地遗忘了,以至于我连提高投票率的“特权”都没有@user1836155很好,很高兴我能帮忙:)顺便问一下,出于好奇:为什么MyObject中的GridView不必在代码中显式声明为依赖项对象才能工作?@user1836155您正在XAML中创建MyObject
的实例,并将其GridView
属性设置为与
中定义的自定义GridView相同。这与说var obj=new MyObject()基本相同;obj.GridView=Resources.MyCustomGridView代码>,除非您是用XAML而不是C#编写的。另一方面,dependencProperty
是一种可以用绑定设置的属性类型,它告诉对象在引用属性时需要在不同的位置查找属性值。@user1836155例如,如果希望将GridView
属性绑定到另一个位置中存在的值,而不是将其设置为StaticResource
,则需要将其设置为依赖属性。这样,它就可以在不同的位置查找它的值,而不是像普通属性那样简单地读取对象上的值。我希望这是有道理的:)
<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}" />