Liaison bidirectionnelle sur un DataGrid dans WPF
J'ai un WPF DataGrid que je suis de remplissage à l'aide de
var allLines = from Lines in ctx.InvoiceLines join PerPs in ctx.ProductsViews on Lines.ProductCode equals PerPs.ProductCode
where (Lines.BranchNo == BrNo) && (Lines.Docket == Docket)
select new { Lines.ProductCode, Lines.Description, Lines.Inv_Quantity, Lines.Grn_Quantity,
Lines.Inv_Price,Lines.Grn_Price,Lines.Inv_Total, Lines.Grn_Total, Lines.AnalCode,
Lines.Vat_Rate, Lines.GrnNo,Lines.Comment , PerPs.OuterUnits};
dgGrid.ItemsSource = allLines;
Je veux utiliser une liaison bidirectionnelle pour mettre à jour la base de données lorsque les valeurs sont modifiées ou lorsqu'une nouvelle ligne est ajoutée. Est-ce possible?
Mon code xaml est
<DataGrid Grid.Row="3" x:Name="dgGrid" DataContext="{Binding}" FontSize="16" HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible" SelectionUnit="FullRow" SelectionMode="Extended" AutoGenerateColumns="False"
SelectionChanged="dgGrid_SelectionChanged" >
<DataGrid.Columns>
<DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="250" Header="Description" Binding="{Binding Description, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" FontSize="14"/>
<DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="63" Header="Grn_Quantity" Binding="{Binding Grn_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="59" Header="Inv_Price" Binding="{Binding Inv_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="61" Header="Ord_Price" Binding="{Binding Grn_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="72" Header="Inv_Total" Binding="{Binding Inv_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="74" Header="Grn_Total" Binding="{Binding Grn_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="58" Header="AnalCode" Binding="{Binding AnalCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="40" Header="Vat_Rate" Binding="{Binding Vat_Rate, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="GrnNo" Binding="{Binding GrnNo, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="Comment" Binding="{Binding Comment, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Width="Auto" Header="PerP" Binding="{Binding OuterUnits}" IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSteelBlue"/>
</DataGrid.Resources>
</DataGrid>
Lorsque j'exécute ce code, mais le PerP colonne est vide.
Je suis assez perdu de la façon de faire de la meilleure façon de sorte que toute aide sera très appréciée.
OriginalL'auteur Noelle | 2011-10-21
Vous devez vous connecter pour publier un commentaire.
Tous les
Bindings
pour votreDataGridTextColumn
en plus de la "PerP" colonne sont en spécifiant le chemin plus d'une fois. Par exemple:Ici votre
Binding
est d'abord spécifier le chemin d'accès à "code produit", puis de préciser qu'il soit "IsSelected". Depuis il n'y a pas de "IsSelected" de la propriété sur les objets de la collection qui vous lient à la grille, si vous exécutez ce sous le débogueur, vous devriez voir la liaison des erreurs dans la fenêtre de Sortie. Si vous supprimez lePath=IsSelected
pour ces liaisons, puis les valeurs de la colonne doit être lié correctement.Votre source de données est une collection d'un type anonyme, de sorte que le
var
est nécessaire, mais comme d'autres l'ont dit les deux sens de la liaison à la collection n'est pas d'aller travailler pour les mises à jour vers la source.Oui, en se liant à des instances de l'objet réel que vous voulez être mis à jour, ce qui dans votre cas, serait entités suivies par Entity Framework. Je suppose qu'en fin de compte, vous voulez que les modifications soient enregistrées dans la base de données de sorte qu'il est logique pour les mises à jour d'affecter l'EF entités qui sont en train de faire le suivi des modifications de sorte que plus tard, toutes les modifications peuvent être vidées à la base de données.
Auriez-vous un lien vers l'un des sites qui permettrait de voir comment cela pourrait être fait?
msdn.microsoft.com/en-us/data/Video/ff806174
Merci Steve, c'est vraiment de la bonne vidéo, je pense que c'est exactement ce dont j'avais besoin. 🙂
OriginalL'auteur Steve Rowbotham
Votre
allLines
variable est une énumération d'un type anonyme. En C# les types anonymes sont en lecture seule - les propriétés ne peuvent pas être modifiés, et les changements ne peuvent pas être sauvés.Essayez de faire de votre requête:
Au lieu de projeter les résultats de votre requête au sein d'une collection d'un type anonyme (c'est à dire à l'aide de
new {...}
) sélectionnez les Lignes comme Paul l'a montré ci-dessus, car ils devront suivre les modifications qui y sont apportées.OriginalL'auteur Paul Stovell
Si le "allLines" la variable est un
DataTable
, vous pourriez tout simplement votre grille de données estAutoGenerateColumns
de vrai.Vous devez également ne pas utiliser le "DataContext de la propriété", mais "ItemsSource" à la place.
Quelque chose comme ceci:
Mettre à jour la base de données sur les changements, appelez le
Update()
méthode de votre datatable, sur un bouton "Enregistrer" cliquez par exemple.Si "allLines" n'est pas un DataTable, puis retirez cette infernale mot clé "var" et de nous dire la vraie nature de la variable =)
TBH son assez clair dans le code de la variable sur le côté gauche de l'affectation n'est pas une DataTable, ce n'est donc pas pertinente. Il s'agit clairement d'une collection d'un type anonyme, et donc le var est nécessaire.
OriginalL'auteur Louis Kottmann