J'ai eu le même problème.
En utilisant l'information fournie dans jsmith de réponse et sur Nigel Spencer du blog, j'ai trouvé une solution qui ne nécessite pas de modification de WPF DataGrid code source, sous-classement ou l'ajout de code pour afficher le code-behind. Comme vous pouvez le voir, ma solution est très MVVM Sympathique.
usingSystem.Windows;namespaceMy.Common.Behaviors{internalclassReadOnlyService:DependencyObject{#region IsReadOnly///<summary>///IsReadOnly Attached Dependency Property///</summary>privatestaticreadonlyDependencyPropertyBehaviorProperty=DependencyProperty.RegisterAttached("IsReadOnly",typeof(bool),typeof(ReadOnlyService),newFrameworkPropertyMetadata(false));///<summary>///Gets the IsReadOnly property.///</summary>publicstaticboolGetIsReadOnly(DependencyObject d){return(bool)d.GetValue(BehaviorProperty);}///<summary>///Sets the IsReadOnly property.///</summary>publicstaticvoidSetIsReadOnly(DependencyObject d,bool value){
d.SetValue(BehaviorProperty, value);}#endregion IsReadOnly}}
DataGridRowReadOnlyBehavior.cs
usingSystem;usingSystem.Windows.Controls;usingSystem.Windows.Interactivity;namespaceMy.Common.Behaviors{///<summary>///Custom behavior that allows for DataGrid Rows to be ReadOnly on per-row basis///</summary>internalclassDataGridRowReadOnlyBehavior:Behavior<DataGrid>{protectedoverridevoidOnAttached(){base.OnAttached();if(this.AssociatedObject==null)thrownewInvalidOperationException("AssociatedObject must not be null");AssociatedObject.BeginningEdit+=AssociatedObject_BeginningEdit;}privatevoidAssociatedObject_BeginningEdit(object sender,DataGridBeginningEditEventArgs e){var isReadOnlyRow =ReadOnlyService.GetIsReadOnly(e.Row);if(isReadOnlyRow)
e.Cancel=true;}protectedoverridevoidOnDetaching(){AssociatedObject.BeginningEdit-=AssociatedObject_BeginningEdit;}}}
Je vous remercie.La bonne réponse est ici. il a travaillé pour moi comme un charme. Vous avez besoin de la propriété IsReadOnly quelque part pour faire ce travail, j'ai donc ajouté une interface et commentée e.Ligne.Élément, rendant la ReadOnlyService inutile, de l'OMI. Gros +1 sur cette même si. Cheers
J'ai trouvé un couple de solutions simples à ce problème. Le meilleur à mon avis, était de raccorder à la BeginningEdit cas de la grille de données. Ceci est similaire à ce que Nigel Spencer n'a dans son poste, mais vous n'avez pas à le remplacer à partir de grille de données. Cette solution est idéal car il ne permet pas à l'utilisateur de modifier les cellules de la ligne, mais il ne leur permettre de sélectionner la ligne.
Dans Le Code Behind:
privatevoidMyList_BeginningEdit(object sender,DataGridBeginningEditEventArgs e){if(((MyCustomObject)e.Row.Item).IsReadOnly)//IsReadOnly is a property set in the MyCustomObject which is bound to each row{
e.Cancel=true;}}
Solution différente... Cela ne permet pas à l'utilisateur de sélectionner la ligne, mais ne nécessite pas de code supplémentaire dans le code derrière.
<DataGridItemsSource="{Binding MyObservableCollection}"><DataGrid.Resources><StyleTargetType="{x:Type DataGridRow}"><Style.Triggers><DataTrigger Binding="{Binding IsReadOnly}"
Value="True"><Setter Property="IsEnabled"
Value="False"/><!-- You can also set "IsHitTestVisble"= False but please note that this won't prevent the user from changing the values using the keyboard arrows --></DataTrigger></Style.Triggers></Style></DataGrid.Resources><DataGrid.Columns><DataGridTextColumnBinding="{Binding Name}"Header="Name"/><DataGridTextColumnBinding="{Binding Age}"Header="Age"/></DataGrid.Columns></DataGrid>
Le code XAML seule approche est beaucoup mieux et plus propre 🙂
Je pense que la meilleure façon de le faire est d'ajouter une propriété IsReadOnly à la DataGridRow classe. Il y a un article détaillé par Nigel Spencer sur la façon de faire ici.
Merci, j'ai dû voir ce post. Je m'attendais à quelque chose de plus facile. Je n'aime pas l'idée de modifier le code source (pour maintability questions lorsque de nouvelles versions sortent). Oui, C'est Malheureux qu'ils ont encore à ajouter une propriété IsReadOnly à leur DataGridRow, il y a un IsEnabled fonctionnalité, vous pouvez jouer avec toutefois. Je vais jeter un oeil, merci.
J'ai eu le même problème.
En utilisant l'information fournie dans jsmith de réponse et sur Nigel Spencer du blog, j'ai trouvé une solution qui ne nécessite pas de modification de WPF DataGrid code source, sous-classement ou l'ajout de code pour afficher le code-behind. Comme vous pouvez le voir, ma solution est très MVVM Sympathique.
Il utilise Expression Blend Comportement Attaché à mécanisme de sorte que vous aurez besoin pour installer Expression Blend SDK et d'ajouter une référence à Microsoft.Expression.Interactions.dll mais ce problème pourrait être facilement converti à natif de comportement attaché à si vous n'aimez pas ça.
Utilisation:
ReadOnlyService.cs
DataGridRowReadOnlyBehavior.cs
Vous avez besoin de la propriété IsReadOnly quelque part pour faire ce travail, j'ai donc ajouté une interface et commentée e.Ligne.Élément, rendant la ReadOnlyService inutile, de l'OMI. Gros +1 sur cette même si. Cheers
OriginalL'auteur surfen
J'ai trouvé un couple de solutions simples à ce problème. Le meilleur à mon avis, était de raccorder à la BeginningEdit cas de la grille de données. Ceci est similaire à ce que Nigel Spencer n'a dans son poste, mais vous n'avez pas à le remplacer à partir de grille de données. Cette solution est idéal car il ne permet pas à l'utilisateur de modifier les cellules de la ligne, mais il ne leur permettre de sélectionner la ligne.
Dans Le Code Behind:
En XAML:
Solution différente... Cela ne permet pas à l'utilisateur de sélectionner la ligne, mais ne nécessite pas de code supplémentaire dans le code derrière.
OriginalL'auteur javajavajavajavajava
Je pense que la meilleure façon de le faire est d'ajouter une propriété IsReadOnly à la DataGridRow classe. Il y a un article détaillé par Nigel Spencer sur la façon de faire ici.
Oui, C'est Malheureux qu'ils ont encore à ajouter une propriété IsReadOnly à leur DataGridRow, il y a un IsEnabled fonctionnalité, vous pouvez jouer avec toutefois.
Je vais jeter un oeil, merci.
OriginalL'auteur jsmith