XAML 中的可见名称

问题描述 投票:0回答:4

我有一个数据网格,其中有一列包含

ComboBox
。我已经为组合框设置了
Name
,但该名称在代码中不可见,为什么?

<DataGrid ...>
    <DataGrid.Columns>
        <DataGrid.TemplateColumn>
             <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Name="mex" Style="{DynamicResource ComboBoxStyle}"
                              ItemsSource="{Binding Path=combolist}"
                              SelectionChanged="status_SelectionChanged" Height="auto" Width="Auto">
                    </ComboBox>
                </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
        </DataGrid.TemplateColumn>
        ...
    </DataGrid.Columns>
</DataGrid>

在C#代码中

mex
是空的,不可见,为什么?

我也尝试了

x:Name="mex"
,但还是看不到。

c#:

mex.ItemsSource = dt;

未定义

mex

c# wpf xaml
4个回答
3
投票

A

DataGridColumn
实际上从来不在逻辑树或视觉树中;它始终是
DataGridRow
DataGridCells
,因为它们是为 DataGrid 中的每一行自动创建的。

访问组件的唯一方法是构建复杂的绑定或使用逻辑或可视树帮助器找到它。

顺便说一句,您应该将

ItemsSource
ComboBox
Bindings
设置为行中的可用数据。您无法在
ElementName
中使用
DataGridTemplateColumn
创建绑定,因为它不在逻辑或可视树中。

我发现了一个有趣的链接,它解释了 DataGrid 的可视化树:http://blogs.msdn.com/b/vinsibal/archive/2008/08/14/wpf-datagrid-dissecting-the-visual-layout。 aspx.


0
投票

当元素存储在项目模板中时,您无法直接引用元素。通常,您希望通过将数据上下文设置为父对象来允许视图模型处理绑定,然后允许项目模板中的元素选择它。然而,根据您的问题,您似乎正在尝试直接从后面的代码执行此操作。

这里有两个类似的问题和解决方案,用于设置项目的数据上下文以及引用项目模板中的元素。希望这有帮助

从 DataTemplate 访问父 DataContext

WPF - ItemsControl - 如何找到 ItemTemplate 中的“CheckBox”项目?


0
投票

因为模板被所有行使用。如果名称可用。必须在视觉树中同时具有相同的名称。


0
投票

这只是 @Kolky 链接的更新,因为必须浏览大量 MSDN 档案才能找到它。

DataGrid 的可视化树 - WPF DataGrid:剖析可视化布局

P.S.:低代表无法对 Kolky 的回答发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.