Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF从模板对象获取指针_C#_Wpf_Xaml_Templates - Fatal编程技术网

C# WPF从模板对象获取指针

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

我有一个XAML代码段,如下所示:

<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}" />