Textbox.Text自行更改而不触发Textchanged事件(不绑定问题)

时间:2011-07-20 13:17:38

标签: c# silverlight windows-phone-7

我是初学者,我正在为Wndows Phone 7创建一个应用程序。

你必须知道的第一件事是我的代码在我第一次加载页面时效果很好(从菜单到ConversationPage,菜单包含一个对话列表)。然后,如果我使用硬键返回菜单页面,然后单击同一个对话再次加载相同的对话页面,则问题就会出现。

基本上,我有一个名为MessageBoxMessage的文本框,以及applicationBar中的SendButton。

我想要的是:当我单击SendButton时,它会查看MessageBoxMessage.Text并在PostToWeb函数中发送该值。

问题:当我重新加载页面时,在框中写一些内容并单击SendButton,MessageBoxMessage.Text会神奇地更改为“”或“新消息”。

我在MessageBoxMessage_TextChanged事件和SendButton_Click事件的开头引入了一个断点,其值来自“blablabla”(最近时间MessageBoxMessage_TextChanged已触发)到“”或“新消息”(当SendButton_Click触发时)。

我无法理解为什么......我还有另一个级联的问题所以我想这是一个很大的初学者问题...... (顺便说一句,我已经检查过,事件只定义了一次)

对不起我的英文,我希望你能帮忙:) 非常感谢

private void MessageBoxMessage_GotFocus(object sender, RoutedEventArgs e)
    {
        MessageBoxMessageHasFocus = true;

        if (MessageBoxMessage.Text == "new message")
        {
            MessageBoxMessage.Text = "";

            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else if (MessageBoxMessage.Text == "")
        {
            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else
        {
            SendButton.IsEnabled = true;
        }

    }

    private void MessageBoxMessage_LostFocus(object sender, RoutedEventArgs e)
    {
        MessageBoxMessageHasFocus = false;

        if (MessageBoxMessage.Text == "")
        {                
            MessageBoxMessage.Text = "new message";

            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else if (MessageBoxMessage.Text == "new message")
        {                
            if (hasPictureAttached == true)
            { SendButton.IsEnabled = true; }
            else
            { SendButton.IsEnabled = false; }
        }
        else
        {
            SendButton.IsEnabled = true;
        }

    }

    int MessageBoxMessageTextChangedCounter = 0;
    private void MessageBoxMessage_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (MessageBoxMessageTextChangedCounter == 0)
        {
            if ((MessageBoxMessage.Text != "" && MessageBoxMessage.Text != "new message") || hasPictureAttached == true)
            {
                SendButton.IsEnabled = true;
            }
            else { SendButton.IsEnabled = false; }

            MessageBoxMessageTextChangedCounter = 1;
            return;
        }
        else
        {
            MessageBoxMessageTextChangedCounter = 0;
        }

        if (MessageBoxMessage.Text != "" && MessageBoxMessage.Text != "new message")
        {
            MessageString = MessageBoxMessage.Text;
        }
    }


    private void SendButton_Click(object sender, EventArgs e)
    {
        if (MessageBoxMessage.Text == "new message" && hasPictureAttached == true)
        { MessageBoxMessage.Text = "";}


            SendButton.IsEnabled = false;
            if (hasPictureAttached == true)
            {
                //MessageString = MessageBoxMessage.Text;
                GetPictureUrl();
                hasPictureAttached = false;
            }
            else
            {
                //MessageString = MessageBoxMessage.Text;
                POSTmessage();
            }



        if (MessageBoxMessageHasFocus == true)
        {
            MessageBoxMessage.Text = "";
            MessageBoxMessage.SetValue(TextBox.TextProperty, "");
        }
        else
        {
            MessageBoxMessage.Text = "new message";
            MessageBoxMessage.SetValue(TextBox.TextProperty, "new message");
        }


    }

以下是XAML

<TextBox x:Name="MessageBoxMessage" Margin="-12,0,-12,12" TextWrapping="Wrap" Foreground="Gray" TextChanged="MessageBoxMessage_TextChanged" LostFocus="MessageBoxMessage_LostFocus" GotFocus="MessageBoxMessage_GotFocus">
                        <TextBox.InputScope>
                            <InputScope>
                                <InputScopeName NameValue="Chat" />
                            </InputScope>
                        </TextBox.InputScope>
                    </TextBox>

1 个答案:

答案 0 :(得分:1)

运行整个项目后......

(感谢您通过电子邮件提供完整版。这使调试变得更加容易)......

事件处理程序存在一些问题,但 Magic 值的实际原因是,每次导航到ConversationPage时,都会创建一个新的ConversationPage对象,但是前一个(s)未被销毁或重复使用。

如果您不止一次离开ConversationPage,您实际上会为所创建的ConversationPage对象的每个实例点击一次SendButton_Click

原因是你的SendButton对象是一个单独的,跨页面共享,因此连接到它的每个页面都有自己的click事件。页面与静态SendButton对象之间存在该链接意味着永远不会删除“对话”页面(您可以使用皮带!)。

您需要删除SendButton处理程序以响应OnNavigatedFrom页面事件,如下所示:

SendButton.Click -= SendButton_Click;

这将删除当前页面的处理程序并允许它死于优雅的死亡。