【问题标题】:Accessing DataGrid from DataTemplate (silverlight)从 DataTemplate (silverlight) 访问 DataGrid
【发布时间】:2013-12-13 18:06:21
【问题描述】:

WPF How to access control from DataTemplate

在上面的例子中,答案都与 .Net 解决方案有关。我正在为 silverlight 寻找类似的解决方案,它在框架模板上没有 FindName。我的 DataTemplate 有一个网格,我需要使用它来打开网格上的选定项。我目前有 4 个使用 contentpresenter 放置的网格,并且由于 Silverlight 不支持 TemplateSelector,我将可见性设置为隐藏和显示正确的内容演示者。 有没有办法可以在我的数据模板中访问 Grid?

<DataTemplate x:Key="DefaultTemplate">
            <toolkit:DataGrid x:Name="dgGrid" 
                              ItemsSource="{Binding List}" 
                              HorizontalAlignment="Stretch"
                              HeadersVisibility="Column"
                              ColumnHeaderHeight="30" 
                              VerticalGridLinesBrush="Transparent"
                              AutoGenerateColumns="False" 
                              SelectionMode="Single"
                              RowStyle="{StaticResource rowStyle}" 
                              FontSize="16" 
                              IsReadOnly="True">
                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTemplateColumn Width="Auto" SortMemberPath="IsInvalid" >
                        <toolkit:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="!" Visibility="{Binding IsInvalid, Converter={StaticResource conv}}"/>
                            </DataTemplate>
                        </toolkit:DataGridTemplateColumn.CellTemplate>
                    </toolkit:DataGridTemplateColumn>
                    <!--Open Button-->
                    <toolkit:DataGridTemplateColumn Width="70">
                        <toolkit:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Open"
                                    Width="60"
                                    FontSize="14"
                                VerticalAlignment="Center"                                  HorizontalAlignment="Center"
                                    Margin="0"  
                                    Click="Open_Click"
                                    />
                            </DataTemplate>
                        </toolkit:DataGridTemplateColumn.CellTemplate>
                    </toolkit:DataGridTemplateColumn>

                    <toolkit:DataGridTextColumn Header="Name" Width="150" FontSize="18" Binding="{Binding CustomerName}" />


                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>
        </DataTemplate>

我正在尝试访问上述 DataTemplate 上的 dgGrid

更新:

在我的控制下,我有关注

<StackPanel>

        <ContentPresenter Content="{Binding}" DataContext="{Binding}" ContentTemplate="{StaticResource Template1}" Visibility="{Binding PanelID,Converter={StaticResource ParamVisibilityConv}, ConverterParameter=5}"/>
        <ContentPresenter Content="{Binding}" DataContext="{Binding}" ContentTemplate="{StaticResource Template2}" Visibility="{Binding PanelID,Converter={StaticResource ParamVisibilityConv}, ConverterParameter=7}"/>
        <ContentPresenter Content="{Binding}" DataContext="{Binding}"  ContentTemplate="{StaticResource Template3}" Visibility="{Binding PanelID,Converter={StaticResource ParamVisibilityConv}, ConverterParameter=13}"/>
        <ContentPresenter Content="{Binding}" DataContext="{Binding}"  ContentTemplate="{StaticResource DefaultTemplate}" Visibility="{Binding PanelID,Converter={StaticResource ParamVisibilityConv}, ConverterParameter=4}"/>

</StackPanel>

我正在尝试在后面的代码中访问网格

StackPanel sp = (StackPanel) this.Content;
            foreach (var child in sp.Children)
            {
                if (child is ContentPresenter && ((ContentPresenter) child).Visibility == Visibility.Visible)
                {
                    DataTemplate dt = ((ContentPresenter) child).ContentTemplate;
                }
            }

它返回一个 DataTemplate,但 FrameworkTemplates 没有 FindName 函数来查找 DataTemplate 中的元素。

有解决办法吗?

【问题讨论】:

    标签: .net silverlight datagrid datatemplate


    【解决方案1】:

    找到您的 DataTemplate 后,您必须加载其中的任何内容。 例如:

    var grid = dt.LoadContent() as DataGrid/StackPanel/AnyElement;
    

    加载元素后,您可以使用 System.Linq 程序集在其中执行高级查询。

    例如:

    var item = grid.Children.First(c => c.Name == "element1");
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复,我无法对此进行测试。我最终用一些重复的代码创建了一个全新的控件。尽管如此,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2014-12-04
    • 2021-12-21
    相关资源
    最近更新 更多