Utilisation de WPF DataGridComboBoxColumn avec MVVM - Liaison à une propriété dans ViewModel
Je suis l'aide de l'excellent MVVM Light Toolkit. Mon ViewModel expose:
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);
}
}
Le point de Vue a un DataGrid:
<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>
Le contrôle DataGrid est un ItemsSource, comme vous pouvez le voir, de CourtCodes. Je veux le CourtType colonne à une liste déroulante de tous les énumérés CourtTypes qui sont contenues dans l'CourtCodesTypeCourt. Pour la vie de moi, je n'arrive pas à remplir le DataGridComboBoxColumn avec quoi que ce soit. L'actuelle tentative a échoué, est à la recherche d'utiliser RelativeSource... ce que je fais mal?
En plus de ne pas travailler, les deux erreurs que je vois sont:
Système.De Windows.Erreur De Données: 4 : Ne Peut Pas
trouver la source de la liaison avec la référence
'RelativeSource FindAncestor,
AncestorType='Système.De Windows.Fenêtre",
AncestorLevel='1".
BindingExpression:Path=DataContext.CourtCodesTypeCourt;
DataItem=null; élément cible est
'DataGridComboBoxColumn'
(HashCode=38771709); cible de la propriété
est "ItemsSource' ('type IEnumerable')
et
Système.De Windows.Erreur De Données: 40 :
BindingExpression erreur de chemin d'accès:
'CourtCodesTypeCourt la propriété de ne pas
trouvé sur l '"objet" "Cour"
(HashCode=38141773)'.
BindingExpression:Path=CourtCodesTypeCourt.CourtTypeDescription;
DataItem= "Cour" (HashCode=38141773);
élément cible est la "zone de liste déroulante'
(Name="); la propriété target est 'Texte'
(de type 'String')
source d'informationauteur Mike L
Vous devez vous connecter pour publier un commentaire.
DataGrid
définitions de colonne de ne pas participer à l'arborescence logique dans la façon que vous attendez. C'est ridicule, mais la dernière que j'ai vérifié que vous avez à faire quelque chose comme ceci:Vous remarquerez que j'ai aussi changé votre
TextBinding
à unSelectedItemBinding
. Je ne sais pas si vous avez prévu unTextBinding
mais si vous voulez juste pour permettre à l'utilisateur de choisir entre la liste, puisSelectedItemBinding
est probablement ce que vous voulez.Aussi, vos VMs ne sont pas exactement conformes aux meilleures pratiques. Vous êtes à l'aide de
List<T>
au lieu deObservableCollection<T>
et vous êtes de l'exposer commeList<T>
plutôt que quelque chose de plus simple commeICollection<T>
.Ici, j'ai trouvé la réponse http://cinch.codeplex.com/discussions/239522
Pour la DataGridComboBoxColumn vous devez créer un StaticRecource de la ItemsSource comme:
et le lier à la DataGridComboBoxColumn:
C'est parce que la fonction des colonnes datagridcolumn ne sont pas une partie de l'arborescence visuelle.
Et si vous voulez lier sur une collection de un point de la grille de données, vous devez définir le ItemsSource plus de deux styles:
Découvrez ce superbe tutoriel/exemple:
https://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82