Tengo dos clases de modelo simples y un ViewModel ...
public class GridItem
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ViewModel
{
public ViewModel()
{
GridItems = new ObservableCollection<GridItem>() {
new GridItem() { Name = "Jim", CompanyID = 1 } };
CompanyItems = new ObservableCollection<CompanyItem>() {
new CompanyItem() { ID = 1, Name = "Company 1" },
new CompanyItem() { ID = 2, Name = "Company 2" } };
}
public ObservableCollection<GridItem> GridItems { get; set; }
public ObservableCollection<CompanyItem> CompanyItems { get; set; }
}
... y una simple ventana:
<Window x:Class="DataGridComboBoxColumnApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
ViewModel se establece en MainWindow DataContext
en App.xaml.cs:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow window = new MainWindow();
ViewModel viewModel = new ViewModel();
window.DataContext = viewModel;
window.Show();
}
}
Como puede ver, configuré ItemsSource
el DataGrid en la GridItems
colección de ViewModel. Esta parte funciona, se muestra la línea de cuadrícula única con el nombre "Jim".
También quiero establecer el ItemsSource
ComboBox en cada fila en la CompanyItems
colección de ViewModel. Esta parte no funciona: el ComboBox permanece vacío y en la ventana de salida del depurador veo un mensaje de error:
Error de System.Windows.Data: 2: No se puede encontrar FrameworkElement o FrameworkContentElement para el elemento de destino. BindingExpression: Path = CompanyItems; DataItem = null; el elemento de destino es 'DataGridComboBoxColumn' (HashCode = 28633162); la propiedad de destino es 'ItemsSource' (tipo 'IEnumerable')
Creo que WPF espera CompanyItems
ser una propiedad de la GridItem
cual no es el caso, y esa es la razón por la que falla el enlace.
Ya intenté trabajar con a RelativeSource
y AncestorType
así:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
Pero eso me da otro error en la salida del depurador:
Error de System.Windows.Data: 4: No se puede encontrar la fuente para el enlace con la referencia 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''. BindingExpression: Path = CompanyItems; DataItem = null; el elemento de destino es 'DataGridComboBoxColumn' (HashCode = 1150788); la propiedad de destino es 'ItemsSource' (tipo 'IEnumerable')
Pregunta: ¿Cómo puedo vincular ItemsSource de DataGridComboBoxColumn a la colección CompanyItems de ViewModel? ¿Es posible en absoluto?
¡Gracias por la ayuda de antemano!