gpt4 book ai didi

c# - CRM 2011 Silverlight 应用程序 - 无法将项目添加到 DataGridTemplateColumn 单元格内的组合框

转载 作者:行者123 更新时间:2023-11-30 17:57:14 27 4
gpt4 key购买 nike

我在我的 xaml 中声明一个数据网格模板列,如下所示:

<sdk:DataGridTemplateColumn x:Name="MyColumn" Header="User">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="comboBox1" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>

然后我尝试像这样填充组合框:

DataServiceQuery<SystemUser> query = (DataServiceQuery<SystemUser>)_context.SystemUserSet;
query.BeginExecute(OnUserSearchComplete, query);

(在 InitializeComponent() 行之后运行)

然后:

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);
}
}

但是,当我在 CRM 中运行该应用程序时,组合框不会随我的系统用户一起出现。谁能解释我做错了什么?我现在尝试了几种不同的方法,但似乎无法让它发挥作用。

谢谢,

jack

编辑;调试:

  • 响应返回 3 个系统用户对象 - 这是正确的。
  • comboBox1 不等于 null。

这是我的网格布局方式(类似于 SDK 示例): enter image description here

编辑2;出于某种原因,我的代码似乎没有进入 foreach 循环,有什么想法吗?

编辑3;好的,所以使用安德鲁在他下面的回答中提供的信息,我有以下代码:

                    //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>

不幸的是,我的绑定(bind)似乎不起作用,我之所以这样说是因为我使用了一个字符串生成器和一个文本框来存储和显示从 CRM 检索到的用户名,并且它们都被正确地检索到了,但它们没有出现在组合框中。谁能解释为什么我的绑定(bind)不正确?

最佳答案

您是否尝试过在 XAML 中绑定(bind) ComboBox.ItemsSource 而不是在代码隐藏中直接添加到 ComboBox.Items?也许是这样的?

<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>

然后在代码隐藏中:

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);
}
}

我猜数据网格调用 LoadContent () 在运行时创建单元格时,我猜测当您在代码中调用 LoadContent() 时,您将获得对 ComboBox 的新实例的引用,该实例实际上不在网格中(也不在网格中在视觉树中)。上面的解决方案应该通过让每个 ComboBox 拉入其数据而不是让您的代码隐藏定位每个 ComboBox 并插入数据的责任来规避这个问题。

关于c# - CRM 2011 Silverlight 应用程序 - 无法将项目添加到 DataGridTemplateColumn 单元格内的组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365922/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com