3

次のように、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 でアプリケーションを実行すると、コンボボックスにシステム ユーザーが入力されません。誰かが私が間違っていることを説明できますか? 私は今、いくつかの異なるアプローチを試しましたが、それを機能させることができないようです..

ありがとう、

ジャック

編集; デバッグ:

  • 応答は 3 つのシステム ユーザー オブジェクトを返します - これは正しいです。
  • コンボ ボックス 1 がヌルに等しくありません。

これが私のグリッドのレイアウト方法です(SDKの例と同様): ここに画像の説明を入力

EDIT2; なんらかの理由で、私のコードが foreach ループに入っていないように見えますが、アイデアはありますか?

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>

残念ながら、バインディングが機能していないようです。これは、文字列ビルダーとテキスト ボックスを使用して、CRM から取得したユーザー名を保存および表示し、すべて正しく取得されたためです。コンボボックスに表示されません。私のバインディングが間違っている理由を誰か説明できますか?

4

1 に答える 1

1

コード ビハインドで ComboBox.Items に直接追加するのではなく、XAML で ComboBox.ItemsSource をバインドしようとしましたか? おそらくこのようなものですか?

<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 に答える