3

我在我的 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 示例): 在此处输入图像描述

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

编辑3; 好的,所以使用 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>

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

4

1 回答 1

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 并推入数据来规避该问题。

于 2012-11-14T16:34:44.720 回答