Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WPF应用程序将列表绑定到Telerik RadGridView_C#_Wpf_Xaml_Telerik_Radgridview - Fatal编程技术网

C# 使用WPF应用程序将列表绑定到Telerik RadGridView

C# 使用WPF应用程序将列表绑定到Telerik RadGridView,c#,wpf,xaml,telerik,radgridview,C#,Wpf,Xaml,Telerik,Radgridview,我正在从事一个从谷歌API检索地址的项目。我收到了谷歌的回复,但我在向radgridview显示地址结果(AddressList)时遇到了问题。我正在使用WPF应用程序,只需要将结果显示到RADGRIDVIEW。我正在使用'ItemSource'尝试绑定到网格,但我得到了以下错误:无效的跨线程访问 代码 公共部分类地址搜索:ContentAppEntityView { 公共地址搜索() { 初始化组件(); } HttpWebRequest请求=null; #区域**********搜索****

我正在从事一个从谷歌API检索地址的项目。我收到了谷歌的回复,但我在向radgridview显示地址结果(AddressList)时遇到了问题。我正在使用WPF应用程序,只需要将结果显示到RADGRIDVIEW。我正在使用'ItemSource'尝试绑定到网格,但我得到了以下错误:无效的跨线程访问

代码

公共部分类地址搜索:ContentAppEntityView
{
公共地址搜索()
{
初始化组件();
}
HttpWebRequest请求=null;
#区域**********搜索**********
私有无效地址输入\获取焦点(对象发送方,路由目标)
{
如果(addressInput.Text==“搜索”)
addressInput.Text=“”;
其他的
addressInput.SelectAll();
}
私有无效地址输入\丢失焦点(对象发送方,路由目标)
{
if(addressInput.Text==String.Empty)
{
addressInput.Text=“搜索”;
searchclose.Opacity=0;
}
else if(addressInput.Text==“搜索”)
searchclose.Opacity=0;
}
私有void清空搜索(对象发送者,路由目标e)
{
addressInput.Text=“搜索”;
searchclose.Opacity=0;
}
私有void addressInput\u KeyDown(对象发送方,KeyEventArgs e)
{
searchclose.Opacity=1;
}
私有void Enter\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(e.Key==Key.Enter)
{
var address=addressInput.Text;
var requestUri=string.Format(“http://localhost/media/TextToSpeech/TextToSpeechService.svc/getDataProxy?url=https://maps.googleapis.com/maps/api/geocode/json?address={0}&key=aizasycgsnpuuooh7m6u7lqezjlz3mgm15pw15o“,Uri.EscapeDataString(地址));
//var requestUri=string.Format(ConfigurationManager.GetAppSetting(“addressSearchGeoCode”,Uri.EscapeDataString(address));
HttpWebRequest-request=WebRequest.Create(requestUri)作为HttpWebRequest;
request.Method=“GET”;
IAsyncResult result=request.BeginGetResponse(新的异步回调(RequestCompleted),request);
var dodo=结果;
}
} 
私有无效请求已完成(IAsyncResult结果)
{
var request=(HttpWebRequest)result.AsyncState;
var response=(HttpWebResponse)request.EndGetResponse(result);
Stream=response.GetResponseStream();
尝试
{
StreamReader=新的StreamReader(流);
string text=reader.ReadToEnd();
正则表达式rgx=新正则表达式(“”);
字符串newResult=rgx.Replace(文本“”);
JObject json=JObject.Parse(newResult);
JArray结果=(JArray)json[“结果”];
List latList=新列表();
List lngList=新列表();
列表地址列表=新列表();
如果(results.Count==0)
{
MessageBox.Show(“未找到结果”);
}
其他的
{
foreach(结果中的JObject对象)
{
if(obj==null)
{
MessageBox.Show(“地址未返回结果”);
}
字符串格式化地址=(字符串)obj[“格式化地址”];
地址列表。添加(格式化地址);
双纬度=(双)obj[“几何体”][“位置”][“纬度”];
latList。添加(lat);
双lng=(双)obj[“几何体”][“位置”][“lng”];
添加(液化天然气);
//TODO添加异常处理
}
this.addressGrid.ItemsSource=地址列表;
}
}
捕获(例外情况除外)
{
MessageBox.Show(“错误”+ex.Message);
}
}
}
XAML的部分

<!--Address Results-->
<telerik:RadGridView  Grid.Row="2" AutoGenerateColumns="True" x:Name="addressGrid" Margin="0 0 0 18" 
        ItemsSource="{Binding}" CanUserFreezeColumns="False" CanUserSelect="False"
        EnableColumnVirtualization="True" EnableRowVirtualization="True" ShowGroupPanel="False" ScrollViewer.VerticalScrollBarVisibility="Visible"
        CanUserDeleteRows="True" RowIndicatorVisibility="Collapsed" DataLoadMode="Asynchronous" HeaderRowStyle="{StaticResource ZoneActivityHeaderRowStyle}"
        GroupPanelStyle="{StaticResource GroupPanelStyle}" Background="#00000000" VerticalGridLinesBrush="#00000000" HorizontalGridLinesBrush="#00000000" AlternationCount="2" 
        RowHeight="32" ShowColumnHeaders="False" RowStyle="{StaticResource ActivityRowStyle}" AlternateRowStyle="{StaticResource ActivityAlternateRowStyle}">

    <telerik:RadGridView.Columns>

        <telerik:GridViewDataColumn Header="Targetting" Width="28" IsReadOnly="True" IsFilterable="False" ShowDistinctFilters="True" IsGroupable="False">
            <telerik:GridViewDataColumn.CellTemplate>
                <DataTemplate>
                    <ctrl:TargetButton x:Name="targetButton" VerticalAlignment="Center" HorizontalAlignment="Center" />
                </DataTemplate>
            </telerik:GridViewDataColumn.CellTemplate>
        </telerik:GridViewDataColumn>

        <telerik:GridViewDataColumn Header="Address" Width="*" IsReadOnly="True" 
                IsFilterable="False" ShowDistinctFilters="True" IsGroupable="False">
            <telerik:GridViewDataColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding}" Foreground="White" FontFamily="Segoe UI" 
                                   FontSize="12" VerticalAlignment="Top" Margin="5" TextWrapping="Wrap" />
                        <Border Background="#00000000" Height="32" Margin="-5 0" />
                    </Grid>
                </DataTemplate>
            </telerik:GridViewDataColumn.CellTemplate>
        </telerik:GridViewDataColumn>

    </telerik:RadGridView.Columns>
    </telerik:RadGridView>

    <TextBlock Text="No addresses available" FontFamily="Segoe UI Semibold" FontSize="12" Foreground="#FFFFFF" Grid.Row="2" Margin="18" Visibility="{Binding AddressCollection.Count}" />
</Grid>

听起来好像是因为您试图更新从非UI线程绑定到UI的对象。为了让它工作,你需要让调度员像这样为你做更新

  Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                  new Action(() =>
                  {
                      //Do something
                  }));
我个人使用MVVM Light框架,该框架具有DispatcherHelper类,因此我可以编写如下代码

                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        //Do something
                    });

听起来好像是因为您正试图更新从非UI线程绑定到UI的对象。为了让它工作,你需要让调度员像这样为你做更新

  Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                  new Action(() =>
                  {
                      //Do something
                  }));
我个人使用MVVM Light框架,该框架具有DispatcherHelper类,因此我可以编写如下代码

                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        //Do something
                    });

RadGridView只能在最初创建它的线程上访问。您可以使用dispatcher将对RadGridView的任何调用封送回UI线程。试试这个:

private void RequestCompleted(IAsyncResult result)
{
    var request = (HttpWebRequest)result.AsyncState;
    var response = (HttpWebResponse)request.EndGetResponse(result);
    Stream stream = response.GetResponseStream();

    try
    {
        StreamReader reader = new StreamReader(stream);
        string text = reader.ReadToEnd();

        Regex rgx = new Regex("<.*\\>");
        string newResult = rgx.Replace(text, "");

        JObject json = JObject.Parse(newResult);
        JArray results = (JArray)json["results"];

        List<double> latList = new List<double>();
        List<double> lngList = new List<double>();
        List<string> AddressList = new List<string>();

        if (results.Count == 0)
        {
            Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("No results found")));
        }
        else
        {
            foreach (JObject obj in results)
            {
                if (obj == null)
                {
                    Dispatcher.Invoke(new Action(() => MessageBox.Show("Address returned no results")));
                }
                string formattedAddress = (string)obj["formatted_address"];
                AddressList.Add(formattedAddress);

                double lat = (double)obj["geometry"]["location"]["lat"];
                latList.Add(lat);

                double lng = (double)obj["geometry"]["location"]["lng"];
                lngList.Add(lng);
                //TODO Add exception handling
            }
            Dispatcher.Invoke(new Action(() => this.addressGrid.ItemsSource = AddressList));
        }

    }
    catch (Exception ex)
    {
        Dispatcher.Invoke(new Action(() => MessageBox.Show("Error" + ex.Message)));
    }
}
private void RequestCompleted(IAsyncResult结果)
{
var request=(HttpWebRequest)result.AsyncState;
var response=(HttpWebResponse)request.EndGetResponse(result);
Stream=response.GetResponseStream();
尝试
{
StreamReader=新的StreamReader(流);
string text=reader.ReadToEnd();
正则表达式rgx=新正则表达式(“”);
字符串newResult=rgx.Replace(文本“”);
JObject json=JObject.Parse(newResult);
JArray结果=(JArray)json[“结果”];
List latList=新列表();
List lngList=新列表();
列表地址列表=新列表();
如果(results.Count==0)
{
Dispatcher.BeginInvoke(新操作(()=>MessageBox.Show(“未找到结果”));
}
其他的
{
foreach(J