【问题标题】:WP8 silverlight: can't find a textblock in a DataTemplateWP8 silverlight:在 DataTemplate 中找不到文本块
【发布时间】:2014-08-24 13:39:19
【问题描述】:

我知道这个问题一定已经被问过了,但我找不到任何有用的答案。

我有一个工具包的 CustomMessageBox,与这个 Microsoft 示例非常相似:

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 中无效...

【问题讨论】:

    标签: c# xaml windows-phone-8 windows-phone silverlight-toolkit


    【解决方案1】:

    我会建议你 Databind 那个 TextBlock.Text 代替。但是如果你真的想遍历那个对象。您需要从该消息框派生一个自定义消息框,并且在 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
    

    【讨论】:

    • 我花了好几个小时试图将它绑定到一个局部变量......但它不起作用。如果我将 放在页面中的任何位置,它会显示分数,但在该消息框中,它什么也不显示...
    • 是的,我理解你的沮丧。我修改了解决方案以添加正确的数据绑定方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多