wpf mvvm datagrid datagridcomboboxcolumn

wpf - Cómo vincular datos a DataGridComboBoxColumn en DataGrid utilizando MVVM



(3)

Esto me está volviendo loca. Tengo un DataGrid que tiene un DataGridComboBoxColumn del que quiero que el usuario pueda usar para seleccionar. Este es el esquema básico de mi grilla.

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

DataGrid está vinculado a una colección de objetos de tipo Objetivo. Cada objetivo tiene una propiedad de tipo LifeArea. Cada LifeArea tiene las propiedades LifeAreaId y Name.

El contexto de datos contiene una colección observable de Metas: Lista de objetivos y una lista de Áreas de vida: Lista de vidas. Quiero que el usuario pueda seleccionar un área de vida diferente para un objetivo. Además, el nombre del área de vida debe ser el valor mostrado.

EDITAR

La solución es que ItemsSource para DataGridComboBoxColumn debe establecerse como un recurso estático. Otra opción es establecer el ItemSource a través del código.

Al final tengo:

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

En el código detrás de configurar el ItemsSource:

_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();

Cuando tenga la oportunidad, lo convertiré en un StaticResource.


Además de vincular su SelectedItem, supongo que su propiedad SelectedLifeArea no se obtiene directamente de LifeAreaList, por lo que al comparar los dos valores devuelven false, incluso si el nombre y la identificación coinciden. Probablemente necesite sobrescribir la función .Equals del objeto LifeArea para devolver true si los Id de ambos objetos coinciden

public override bool Equals(object obj) { if (obj is LifeArea) { return this.Id == (obj as LifeArea).Id; } return false; }


Necesitas hacer algo como esto (no dispares el messenger):

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


Up también puede usar un DataGridTemplateColumn y simplemente colocar un ComboBox en él y luego transferir los eventos apropiados a él.

<DataGridTemplateColumn Header="Alpha"> <DataGridTemplateColumn.CellTemplate> <DataTemplate DataType="models:MyModelDescription"> <ComboBox ItemsSource="{Binding AlphaLevels, Mode=OneWay}" SelectedItem="{Binding Alpha, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"></ComboBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>