在代码隐藏中无法识别XAML控件
问题描述:
我有一个奇怪的问题,在后面的代码中XAML控件不可见。这里是XAML的一个样本:在代码隐藏中无法识别XAML控件
<ListView Name="lvtest" Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0"
ItemsSource="{Binding Content}" >
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<WebView Name="contentView" Style="{StaticResource BodyTextStyle}" />
<TextBlock Name="testtxt" Text="{Binding}" Style="{StaticResource BodyTextStyle}" Foreground="GreenYellow"/>
在后面的代码:
this.lvtest
是公认的,但:
this.contentView
和this.testtxt
都没有。我也试过x:Name
。
我很明显在这里错过了一些明显的东西,我只是看不到什么。
编辑:
为了澄清,TextBox控件是要被用来显示基于绑定一些格式化的文本,但我发现的是,文本HTML格式(this建议使用WebView控件)。据我所见,我需要NavigateToString
来使用WebView控件,因此不能像这样绑定它。
答
什么你错过的是,在一个DataTemplate定义的元素可以在页面的任何数量的上次,甚至可以在运行时改变。哪一个应该链接到contentView
字段?没有好的方法来回答这个问题,所以它不会创建一个contentView
字段。换句话说,你并没有定义页面包含这些元素,而是声明了一个可以从中创建元素的模板。
如果你让我们知道你是如何使用它,我们可能会建议另一种方式。
编辑:在代码
<WebView Loaded="contentView_Loaded" Style="{StaticResource BodyTextStyle}" />
然后:这样的事情可能会为你工作
void contentView_Loaded(object sender, EventArgs e)
{
var contentView = (WebView)sender;
var dataContext = (YourDataType)contentView.DataContext;
// do something
}
答
它们是隐藏的,因为它们在模板控件中。
从http://social.msdn.microsoft.com/Forums/en/wpf/thread/29ecc8ee-26ee-4331-8f97-35ff9d3e6886
<ListView Name="listview">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Name="textYear" Text="{Binding Year}" />
<TextBlock Text=" " />
<TextBlock Name="textDayOffWeek" Text="{Binding DayOfWeek}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
<s:DateTime >1/2/2007</s:DateTime>
<s:DateTime >1/3/2008</s:DateTime>
<s:DateTime >1/5/2007</s:DateTime>
<s:DateTime >1/6/2006</s:DateTime>
</ListView>
<Button Width="180" Height="30" Content="Find TextBlock in DataTemplate" Click="FindElement" />
</StackPanel>
在后面的代码:
private void FindElement(object sender, RoutedEventArgs e)
{
// get the current selected item
ListViewItem item = listview.ItemContainerGenerator.ContainerFromIndex(listview.SelectedIndex) as ListViewItem;
TextBlock textYear = null;
if (item != null)
{
//get the item's template parent
ContentPresenter templateParent = GetFrameworkElementByName<ContentPresenter>(item);
//get the DataTemplate that TextBlock in.
DataTemplate dataTemplate = listview.ItemTemplate;
if (dataTemplate != null && templateParent != null)
{
textYear = dataTemplate.FindName("textYear", templateParent) as TextBlock;
}
if (textYear != null)
{
MessageBox.Show(String.Format("Current item's Year is:{0}", textYear.Text));
}
}
}
private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement
{
FrameworkElement child = null;
for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++)
{
child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement;
System.Diagnostics.Debug.WriteLine(child);
if (child != null && child.GetType() == typeof(T))
{ break; }
else if (child != null)
{
child = GetFrameworkElementByName<T>(child);
if (child != null && child.GetType() == typeof(T))
{
break;
}
}
}
return child as T;
}
我编辑的问题。基本上我试图在绑定列表中显示格式化的HTML(这就是TextBlock最初的用途)。 –
这不起作用,但你已经把我放在正确的轨道上 - 谢谢 –