Estoy usando el excelente MVVM Light Toolkit. Mi ViewModel expone:Usando WPF DataGridComboBoxColumn con MVVM - Enlace a la propiedad en ViewModel
public const string CourtCodesTypeCourtPropertyName = "CourtCodesTypeCourt";
private List<CourtType> _courtCodesTypes = new List<CourtType>();
public List<CourtType> CourtCodesTypeCourt
{
get
{
return _courtCodesTypes;
}
set
{
if (_courtCodesTypes == value)
{
return;
}
var oldValue = _courtCodesTypes;
_courtCodesTypes = value;
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged(CourtCodesTypeCourtPropertyName, oldValue, value, true);
}
}
public const string CourtCodesPropertyName = "CourtCodes";
private List<Court> _courtCodes = null;
public List<Court> CourtCodes
{
get
{
return _courtCodes;
}
set
{
if (_courtCodes == value)
{
return;
}
var oldValue = _courtCodes;
_courtCodes = value;
// Update bindings and broadcast change using GalaSoft.Utility.Messenging
RaisePropertyChanged(CourtCodesPropertyName, oldValue, value, true);
}
}
la vista tiene una cuadrícula de datos:
<DataGrid
ItemsSource="{Binding CourtCodes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
AlternatingRowBackground="{DynamicResource OffsetBrown}"
AlternationCount="1" Margin="45,0">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Abbreviation, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="Abbreviation"
Width="25*" />
<DataGridTextColumn Binding="{Binding FullName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Header="Court"
Width="75*" />
<DataGridComboBoxColumn Header="CourtType"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CourtCodesTypeCourt} TextBinding="{Binding CourtTypeDescription}""/>
</DataGrid.Columns>
</DataGrid>
La cuadrícula de datos tiene una ItemsSource, como se puede ver, de CourtCodes. Quiero que la columna CourtType sea un menú desplegable de todos CourtTypes enumerados que se encuentran dentro de CourtCodesTypeCourt. Por mi vida, parece que no puedo llenar DataGridComboBoxColumn con nada. El intento fallido actual está buscando usar RelativeSource ... ¿qué estoy haciendo mal?
Además de no trabajo, los dos errores que veo son:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=DataContext.CourtCodesTypeCourt; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=38771709); target property is 'ItemsSource' (type 'IEnumerable')
y
System.Windows.Data Error: 40 : BindingExpression path error: 'CourtCodesTypeCourt' property not found on 'object' ''Court' (HashCode=38141773)'. BindingExpression:Path=CourtCodesTypeCourt.CourtTypeDescription; DataItem='Court' (HashCode=38141773); target element is 'ComboBox' (Name=''); target property is 'Text' (type 'String')
Gracias por tu ayuda, Kent ... esto definitivamente me acerca. Estoy de acuerdo ... es ridículo tener que recurrir a este tipo de sintaxis. Estoy luchando. Ahora tengo los objetos CourtType que pueblan DataGridComboBoxColumn, pero dentro de esta sintaxis, ¿cómo controlo el texto mostrado? Actualmente enumera el nombre del tipo, no su propiedad CourtTypeDescription. En segundo lugar, agradezco sus comentarios sobre las mejores prácticas ...Yo estaba, quizás erróneamente, bajo la impresión de que MVVM Light Toolkit creó propiedades de mvvminpc en Snippet en ObservableCollections ... ¿Estoy fuera de eso también? –
Ignore la pregunta de mejores prácticas de ObservableCollections ... Lo probé un poco y veo el valor. La posibilidad de engancharse al evento CollectionChanged parece valer la pena por sí misma. Podría usar un empujón en la sintaxis para DataGridComboBoxColumn ... ¡gracias de nuevo por su ayuda! –
@Mike: solo debe poder establecer 'DisplayMemberPath =" CourtTypeDescription "' en su 'DataGridComboBoxColumn'. –