WPF How to access control from DataTemplate
在上面的例子中,答案都与.Net解决方案有关。我正在为silverlight寻找类似的解决方案,它在Framework Template上没有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 :(得分:0)
找到你的DataTemplate后,你必须加载其中的任何内容。 例如:
var grid = dt.LoadContent() as DataGrid/StackPanel/AnyElement;
加载元素后,您可以使用System.Linq程序集在其中执行高级查询。
例如:
var item = grid.Children.First(c => c.Name == "element1");
希望有所帮助