WP8 silverlight:无法在数据模板中找到文本块
本文关键字:文本 数据 silverlight WP8 | 更新日期: 2023-09-27 18:19:13
我知道这个问题肯定已经有人问过了,但是我找不到任何有用的答案。
我有一个工具箱的CustomMessageBox,非常类似于这个微软的例子:
CustomMessageBox messageBox = new CustomMessageBox()
{
ContentTemplate = (DataTemplate)this.Resources["myContentTemplate"],
LeftButtonContent = "speak",
RightButtonContent = "read it",
IsFullScreen = false
};
messageBox.Dismissed += (s1, e1) =>
{
switch (e1.Result)
{
case CustomMessageBoxResult.LeftButton:
// Do something.
break;
case CustomMessageBoxResult.RightButton:
// Do something.
break;
case CustomMessageBoxResult.None:
// Do something.
break;
default:
break;
}
};
messageBox.Show();
消息框的内容在DataTemplate中定义,具体如下:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="myContentTemplate">
<TextBlock x:Name="myTextBlock" />
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
如何通过代码隐藏设置myTextBlock.Text
?
表示命名空间中不存在myTextBlock
。
它可以在WinRT应用程序中工作,但不能在Silverlight中…
我建议你Databind这个TextBlock。文本。但如果你真的想遍历那个物体。你需要从那个消息框中派生出一个自定义消息框,在OnApplyTemplate上,你可以很容易地使用GetTemplateChild()获得子消息框。
但是如果你想用困难的方法:你可以使用VisualTreeHelper,事实上有人已经给你写了一个很好的遍历函数:FindVisualChildByName
解决绑定问题
绑定类示例
public class MainViewModel : INotifyPropertyChanged
{
private string _messagebox_text = "";
public string messagebox_text
{
get
{
return _messagebox_text;
}
set
{
_messagebox_text = value;
NotifyPropertyChanged("messagebox_text");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后你的DataTemplate变成:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="myContentTemplate">
<TextBlock x:Name="myTextBlock" Text="{Binding messagebox_text}" />
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
那么你需要正确设置你的DataContext。诀窍是当你处理一个DataTemplate时,DataContext实际上是在Content
中设置的所以把它们放在一起
MainViewModel _mvm = new MainViewModel();
_mvm.messagebox_text = "what ever";
messageBox = new CustomMessageBox()
{
ContentTemplate = (DataTemplate)this.Resources["myContentTemplate"],
LeftButtonContent = "speak",
RightButtonContent = "read it",
IsFullScreen = false
};
messageBox.Content = _mvm; // set the bind