CRM 2011 Silverlight应用程序 - 无法在DataGridTemplateColumn单元格中向Combobox添加项目

时间:2012-11-13 17:47:10

标签: c# silverlight xaml dynamics-crm-2011

我在我的xaml中声明了一个datagrid模板列,如下所示:

<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中运行应用程序时,组合框并不是我的系统用户。谁能解释一下我做错了什么?我现在尝试了一些不同的方法,但我似乎无法让它发挥作用..

谢谢,

杰克

修改; 调试:

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

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

EDIT2; 出于某种原因,我的代码似乎没有进入foreach循环,任何想法?

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

                                                  

                    //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中检索出来的,它们都被检索出来了正确,但他们并没有出现在组合框中。谁能解释为什么我的绑定不正确?

1 个答案:

答案 0 :(得分:1)

您是否尝试在XAML中绑定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和推送数据的责任。