2013-12-13 41 views
0

WPF How to access control from DataTemplate访问数据网格(Silverlight的)

在上面的例子中,答案都与净溶液。我正在寻找Silverlight的类似解决方案,它没有框架模板上的FindName。我的DataTemplate有一个网格,我需要用它来打开网格上的selecteditem。我目前有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中的元素。

是否有解决方法?

回答

0

找到你的DataTemplate后,你必须加载它里面的东西。 例如:

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

一旦加载可以使用System.Linq的组件,以在其内进行高层次的查询的元素。

例如:

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

希望它可以帮助

+0

感谢您的答复,我没能测试了这一点。我最终用一些重复的代码创建了一个全新的控件。尽管如此,谢谢! – FurqanRauf