如何在Windows Phone 7中更新列表中的内部控件值?

时间:2014-01-31 14:06:14

标签: windows-phone-7 windows-phone

我在windows phone应用程序中工作,我有一个ListBox控件。一个按钮作为内部控制。

因此在绑定数据后的列表20按钮中。现在我想在点击按钮后更改按钮的数据。

这是我的示例代码。这是我的第一个应用程序Windows手机。

 <ListBox Grid.Row="1" HorizontalAlignment="Left" Margin="10,10,0,0" Name="lstInstagramTags" VerticalAlignment="Top" Width="444" Height="562" SelectionChanged="lstInstagramTags_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Height="100" Margin="-10,-10,-10,-10">

                        <Button Click="Button_Click" Content="NeedToChangeThisValue" Width="150" FontSize="13" Height="60" Margin="-560,35,5,5" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    private void Button_Click(object sender, RoutedEventArgs e)
            {
    HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(myUri);
                    myRequest.Method = "POST";
                    myRequest.ContentType = "application/x-www-form-urlencoded";
                    myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest);
    }

void GetRequestStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
            // End the stream request operation
            Stream postStream = myRequest.EndGetRequestStream(callbackResult);

            string PostData = "action=follow&access_token=966258514.201df4f.4b1c5015a7784a63aac00b9a902c4176";

            // Create the post data
            string postData = PostData;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Add the post data to the web request
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            // Start the web request
            myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest);
        }

void GetResponsetStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
            using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
            {
                **string result** = httpWebStreamReader.ReadToEnd();

            }
        }

我想根据结果(标记粗体)更改按钮数据。我没有根据这个结果更新任何控件。

请告诉我任何好方法。

由于

2 个答案:

答案 0 :(得分:1)

我认为这个问题主要是以选项为基础的,所以这里有三个想法

  • Globul Button

在当前页面中定义一个按钮

private Button helerButton;

   private void Button_Click(object sender, RoutedEventArgs e)
        {
            helerButton = (Button)sender;
            HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(myUri);
            myRequest.Method = "POST";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest);
        }

void GetResponsetStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
            using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
            {
               string result = httpWebStreamReader.ReadToEnd();
               helerButton.Content = result

            }
        }
  • 第二种方法

您可以稍微改变代码架构

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(myUri);
        myRequest.Method = "POST";
        myRequest.ContentType = "application/x-www-form-urlencoded";
        myRequest.BeginGetRequestStream(r => 
        {
            var httpRequest = (HttpWebRequest)r.AsyncState;
            var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
            Stream postStream = myRequest.EndGetRequestStream(r);
            string PostData = "action=follow&access_token=966258514.201df4f.4b1c5015a7784a63aac00b9a902c4176";           
            string postData = PostData;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();
            httpRequest.BeginGetResponse(q => 
            {
                    HttpWebRequest request = (HttpWebRequest)q.AsyncState;
                    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(q);
                    using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
                    {
                        string result = httpWebStreamReader.ReadToEnd();

                        Dispatcher.BeginInvoke(() =>
                        {
                            Button b = (Button)sender;
                            b.Content = result;
                            //for consideration 
                            //b.IsEnabled 

                        });
                    }
            }, httpRequest);

        }, myRequest);
    }
  • 最终方法(我个人会选择这个)

是创建任务 Async and Await for Http Networking on Windows Phone

答案 1 :(得分:0)

您需要为同一个

使用可视化树助手

使用此方法挖掘列表框的可视树

 public static T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
        {
            try
            {
                int childCount = VisualTreeHelper.GetChildrenCount(parentElement);
                if (childCount == 0)
                    return null;

                for (int i = 0; i < childCount; i++)
                {
                    var child = VisualTreeHelper.GetChild(parentElement, i);
                    if (child != null && child is T)
                    {
                        return (T)child;
                    }
                    else
                    {
                        var result = FindFirstElementInVisualTree<T>(child);
                        if (result != null)
                            return result;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return null;
        }

这就是你将如何在代码中使用这种方法

ListBoxItem SelectedListBoxItem = this.lstInstagramTags.ItemContainerGenerator.ContainerFromIndex(int index) as ListBoxItem;
                if (SelectedListBoxItem == null)
                    return;
                // Iterate whole listbox tree and search for this items
                Button btn= common.FindFirstElementInVisualTree<Button>(SelectedListBoxItem );
                btn.Content="Hello";

还有一个Link

希望这有帮助。