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