C# CRM 2011 Silverlight应用程序-Can';t将项目添加到DataGridTemplateColumn单元格内的组合框中
我在xaml中声明一个datagrid模板列,如下所示:C# CRM 2011 Silverlight应用程序-Can';t将项目添加到DataGridTemplateColumn单元格内的组合框中,c#,silverlight,xaml,dynamics-crm-2011,C#,Silverlight,Xaml,Dynamics Crm 2011,我在xaml中声明一个datagrid模板列,如下所示: <sdk:DataGridTemplateColumn x:Name="MyColumn" Header="User"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate>
<sdk:DataGridTemplateColumn x:Name="MyColumn" Header="User">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
然后我尝试这样填充组合框:
DataServiceQuery<SystemUser> query = (DataServiceQuery<SystemUser>)_context.SystemUserSet;
query.BeginExecute(OnUserSearchComplete, query);
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
DataServiceQuery query=(DataServiceQuery)\u context.SystemUserSet;
query.BeginExecute(OnUserSearchComplete,查询);
(在InitializeComponent()行之后运行)
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
然后:
private void OnUserSearchComplete(IAsyncResult result)
{
var query = result.AsyncState as DataServiceQuery<SystemUser>;
IEnumerable<SystemUser> response = query.EndExecute(result);
ComboBox comboBox1 = (DataGrid.Columns[4] as DataGridTemplateColumn).CellTemplate.LoadContent() as ComboBox;
// Enumerate over the results of the query
foreach (SystemUser record in response)
{
comboBox1.Items.Add(record.FullName);
}
}
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
private void OnUserSearchComplete(IAsyncResult结果)
{
var query=result.AsyncState作为DataServiceQuery;
IEnumerable response=query.EndExecute(结果);
ComboBox comboBox1=(DataGrid.Columns[4]作为DataGridTemplateColumn)。CellTemplate.LoadContent()作为ComboBox;
//枚举查询结果
foreach(响应中的系统用户记录)
{
comboBox1.Items.Add(record.FullName);
}
}
但是,当我在CRM中运行应用程序时,我的系统用户不会使用组合框。谁能解释我做错了什么?我现在已经尝试了几种不同的方法,但似乎无法使其发挥作用
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
谢谢
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
杰克
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
编辑强>
调试:
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
- 响应返回3个系统用户对象-这是正确的
- comboBox1不等于null
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
EDIT2强>
出于某种原因,我的代码似乎没有进入foreach循环,有什么想法吗
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
EDIT3强>
好的,根据Andrew在下面的回答中提供的信息,我得到了以下代码:
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
//为简洁起见,已删除
//为简洁起见,请删除
不幸的是,我的绑定似乎不起作用,我之所以这么说是因为我使用了一个字符串生成器和一个文本框来存储和显示从CRM检索到的用户名,它们都被正确地检索到,但它们没有出现在组合框中。有人能解释为什么我的绑定不正确吗?您是否尝试过在XAML中绑定ComboBox.ItemsSource,而不是直接添加到ComboBox.Items中的代码隐藏?也许是这样的
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
<UserControl x:Name="MyUserControl">
<UserControl.Resources>
<CollectionViewSource
x:Key="MyCollectionViewSource"
Source="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</UserControl.Resources>
<!-- ... Omitted for brevity ... -->
<sdk:DataGridTemplateColumn x:Name="MyColumn" Header="User">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding Source={StaticResource MyCollectionViewSource}}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</UserControl>
然后在代码隐藏中:
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
public ObservableCollection<string> SystemUsers { get; private set; }
public UserControl()
{
this.InitializeComponent();
this.SystemUsers = new ObservableCollection<string>();
}
private void OnUserSearchComplete(IAsyncResult result)
{
var query = result.AsyncState as DataServiceQuery<SystemUser>;
IEnumerable<SystemUser> response = query.EndExecute(result);
this.SystemUsers.Clear();
foreach (SystemUser record in response)
{
this.SystemUsers.Add(record.FullName);
}
}
public-observeCollection-SystemUsers{get;private-set;}
公共用户控制()
{
this.InitializeComponent();
this.SystemUsers=新的ObservableCollection();
}
私有void OnUserSearchComplete(IAsyncResult结果)
{
var query=result.AsyncState作为DataServiceQuery;
IEnumerable response=query.EndExecute(结果);
this.SystemUsers.Clear();
foreach(响应中的系统用户记录)
{
this.SystemUsers.Add(record.FullName);
}
}
我猜数据网格在创建单元格时会在运行时调用(),我猜在代码中调用LoadContent()时,会得到一个对组合框的新实例的引用,该实例实际上不在网格中(也不在可视化树中)。上述解决方案应该可以避免这个问题,方法是让每个组合框拉入其数据,而不是让代码承担查找每个组合框并推入数据的责任。可能有助于包含到目前为止的调试结果。也就是说,
comboBox1
是否非空?response
是否包含任何项?@dbaseman您好,感谢您的响应,有关调试信息,请参阅我的编辑。我想您在代码后面添加了一个断点,以查看您的响应包含3项。你是说你打了F10几次,它还是跳过了foreach?我为不正确的绑定道歉;我已经更新了我的答案并进行了测试。我认为在这种情况下,ElementName绑定只适用于DataTemplate内的元素。
//Removed for brevity
<sdk:DataGridTemplateColumn x:Name="SalesmanColumn" Header="Salesman" Width="150">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1"
ItemsSource="{Binding SystemUsers, ElementName=MyUserControl}"
/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
//Removed for brevity
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>