15

これは私を夢中にさせています。ユーザーが選択できるようにしたい DataGridComboBoxColumn を持つ DataGrid があります。これが私のグリッドの基本的な概要です。

<DataGrid ItemsSource="{Binding GoalList}" DockPanel.Dock="Bottom" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{Binding LifeAreaList}" Header="Life Area"/>
<DataGrid.Columns>
</DataGrid>

DataGrid は、Goal 型のオブジェクトのコレクションにバインドされています。各目標には、タイプ LifeArea のプロパティがあります。各 LifeArea には、プロパティ LifeAreaId と Name があります。

データ コンテキストには、監視可能な目標のコレクション: GoalList と生活領域のリスト: LifeAreaList が含まれます。ユーザーが目標のために別の生活領域を選択できるようにしたい. また、ライフエリアの名前が表示される値である必要があります。

編集


解決策は、DataGridComboBoxColumn の ItemsSource を静的リソースとして設定する必要があることです。もう 1 つのオプションは、コードを使用して ItemsSource を設定することです。

最後に私は持っています:

<DataGridComboBoxColumn x:Name="_lifeAreaComboBoxColumn" SelectedItemBinding="{Binding LifeArea}" DisplayMemberPath="Name" Header="Life Area">

コード ビハインドでは、ItemsSource を設定します。

_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();

機会があれば、これを StaticResource に変換します。

4

3 に答える 3

22

次のようなことをする必要があります (メッセンジャーを撃たないでください):

<DataGridComboBoxColumn Header="Life Area" SelectedItemBinding="{Binding SelectedLifeArea}">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
            <Setter Property="IsReadOnly" Value="True"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding LifeAreaList}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
于 2010-08-25T08:37:16.803 に答える
1

SelectedItem のバインドに加えて、SelectedLifeArea プロパティが LifeAreaList から直接取得されていないため、名前と ID が一致していても、2 つの値を比較すると false が返されると推測しています。両方のオブジェクトの ID が一致する場合に true を返すように、おそらく LifeArea オブジェクトの .Equals 関数を上書きする必要があります。

public override bool Equals(object obj)
{
    if (obj is LifeArea)
    {
        return this.Id == (obj as LifeArea).Id;
    }
    return false;
}
于 2010-08-25T13:02:24.227 に答える