WPF ComboBox ne pas mettre à jour la source
Je vais essayer d'obtenir un WPF zone de liste déroulante de travail (à l'intérieur de la WPFToolkit Datagrid), et j'ai de la difficulté d'obtenir tous les morceaux correctement aligné. Je suis à l'aide de Linq to entities, et je suis le réglage de l'ensemble du datacontext les résultats d'une requête Linq:
private void LoadDonationGrid()
{
donationGrid.ItemsSource = from donations in entities.Donation
.Include("Family")
.Include("PledgeYear")
.Include("DonationPurpose")
from donationPurposes in entities.DonationPurpose
select new { donations, donationPurposes };
}
J'ai aussi une page bien dans mon code-behind qui fournit le ItemsSource de la zone de liste déroulante:
private IEnumerable donationPurposeList;
public IEnumerable DonationPurposeList
{
get
{
if (donationPurposeList == null)
{
donationPurposeList = from dp in entities.DonationPurpose
select dp;
}
return donationPurposeList.ToList();
}
}
Le XAML de la zone de liste déroulante ressemble à ceci:
<tk:DataGridTemplateColumn Header="Purpose">
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=donations.DonationPurpose.Description, Mode=TwoWay}" />
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
<tk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="cboDonationPurpose"
SelectedValue="{Binding Path=donations.DonationPurposeID, Mode=TwoWay}"
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor},Path=DonationPurposeList}"
DisplayMemberPath="Description"
SelectedValuePath="DonationPurposeID"
/>
</DataTemplate>
</tk:DataGridTemplateColumn.CellEditingTemplate>
</tk:DataGridTemplateColumn>
Et tout semble fonctionner correctement, c'est à dire, les valeurs correspondantes sont affichées dans la zone de liste déroulante, jusqu'au moment où la mise au point des feuilles de la zone de liste déroulante. À ce stade, l'affichage de la valeur renvoie à la valeur d'origine, pas de la nouvelle valeur sélectionnée. J'ai essayé d'utiliser SelectedItem au lieu de SelectedValue, mais qui se termine avec la valeur sélectionnée apparaît pas dans la zone de liste déroulante. Je suis un peu perplexe: il semble que ce bit doit être au travail.
Édité 3/2/09: je suis toujours perplexe sur cette. Je note que dans mon datagrid, toute simple colonnes de données (par exemple, "DataGridTextColumn") mise à jour le sous-jacent de la source de données comme vous le souhaitez. Mais toute mise à jour de mon basées sur des modèles de colonnes ("DataGridTemplateColumn") ou zone de liste déroulante colonnes ("DataGridComboBoxColumn") ne fonctionnent pas: le sous-jacent de la source de données n'est jamais mis à jour. Sûrement d'autres gens ont essayé d'utiliser le WPF.Trousse datagrid et obtenu que ce scénario fonctionne, mais j'ai regardé tous les exemples de code, et je fais essentiellement, ce qu'il a dit de le faire (dans les limites de ma solution), je suis donc à me gratter la tête pourquoi cela ne fonctionne pas.
Toutes les pensées?
source d'informationauteur Ken Smith
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire (sur lequel j'ai passé des journées de la frustration), et j'ai trouvé que la modification de la
UpdateSourceTrigger
sur leSelectedValue
de liaison àPropertyChanged
fixe. Je ne sais pas pourquoi, mais pour moi, la source de données n'a pas été mis à jour jusqu'à ce que j'ai fait ce changement.J'ai été en mesure d'obtenir ce travail. Mais j'ai mis les choses un tout petit peu différemment.
Depuis que je ne savais pas ce que votre source de données a été j'ai fait ma propre afin de simuler le problème de base: avoir une zone de liste déroulante lier correctement à l'intérieur d'un WPF DataGrid.
Voici la composition de mon point de Vue, Modèle:
Avant de commencer, j'ai mis le DataContext de ma Fenêtre pour être une instance de ma bien construit RootViewModel.
Pour la SelectedItem pour lier correctement je dois m'assurer que j'ai surchargé la méthode Equals sur mon entité depuis sous le capot, WPF est l'utilisation de cette méthode pour déterminer qui est le SelectedItem ou pas. Je crois que c'est fondamentalement votre problème à partir du début, ce qui vous a poussé à essayer de se lier à SelectedValue au lieu de SelectedItem.
Vous devez ajouter
dans votre Xaml.
C'est aussi simple que ça...