2016-04-04 11 views
-1

Ich möchte die dritte Spalte meines dataGrid (mit MVVM-WPF) deaktivieren (schließen für die Bearbeitung), aber die Bearbeitung erneut auf Klick von ermöglichen Schaltfläche außerhalb des Grids.Wie kann ich das erreichen? Die Herausforderung, die ich hier gegenüberstellen, ist, wie DataGrid-Eigenschaft auf Knopfdruck abrufen, ich benutze Befehl Muster hier. So sieht mein ViewModel jetzt, was ich in diese Methode schreiben soll, um bestimmte Spalte bearbeitbar zu machen:Ich möchte die eine bestimmte Spalte meines dataGrid aktivieren auf Knopf klicken

public class TicketOverViewViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private TicketDataService ticketDataService; 

     private ObservableCollection<Ticket> tickets; 

     public ObservableCollection<Ticket> Tickets 
     { 
      get 
      { 
       return tickets; 
      } 
      set 
      { 
       tickets = value; 
       RaisePropertyChanged("Tickets"); 
      } 
     } 

     private void RaisePropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public TicketOverViewViewModel() 
     { 
      ticketDataService = new TicketDataService(); 
      LoadData(); 
      LoadCommands(); 


     } 

     private void LoadData() 
     { 
      tickets = ticketDataService.GetAllTickets().ToObservableCollection(); 
     } 



     public ICommand EditCommand { get; set; } 
     private void LoadCommands() 
     { 
      EditCommand = new CustomCommand(EditTicket, CanEditTicket); 
     } 


     private void EditTicket(object obj) 
     { 
      //TODO 
     } 

     private bool CanEditTicket(object obj) 
     { 

      return true; 

     } 
    } 

Dies ist, wie mein Customcommand aussieht:

public class CustomCommand : ICommand 
    { 
     private Action<object> execute; 
     private Predicate<object> canExecute; 

     public CustomCommand(Action<object> execute, Predicate<object> canExecute) 
     { 
      this.execute = execute; 
      this.canExecute = canExecute; 
     } 

     public bool CanExecute(object parameter) 
     { 
      bool b = canExecute == null ? true : canExecute(parameter); 
      return b; 
     } 

     public event EventHandler CanExecuteChanged 
     { 
      add 
      { 
       CommandManager.RequerySuggested += value; 
      } 
      remove 
      { 
       CommandManager.RequerySuggested -= value; 
      } 
     } 

     public void Execute(object parameter) 
     { 
      execute(parameter); 
     } 
    } 

Meine Ansicht:

<Window x:Class="DataGridMVVM.View.TicketOverView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:DataGridMVVM.View" 
     mc:Ignorable="d" 
     Title="Ticket Overview" Height="348.936" Width="421.277" 
     DataContext= "{Binding Source={StaticResource mainViewModelLocator}, Path=TicketOverViewViewModel }"> 
    <Grid> 

     <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" VerticalAlignment="Top" 
        AutoGenerateColumns="True" ItemsSource="{Binding Tickets}" IsReadOnly="True" 
        CanUserResizeColumns="True" Height="100" Width="400" /> 
     <Button x:Name="button" Content="Edit" Command="{Binding EditCommand}" 
       HorizontalAlignment="Left" Margin="239,183,0,0" VerticalAlignment="Top" Width="75" /> 


    </Grid> 
</Window> 
+0

Seit Mein Gitter wird nur gelesen, wenn die Ansicht geladen ist. Ich möchte es bearbeiten lassen Klicken Sie auf Bearbeiten-Schaltfläche, klicken Sie auf Befehlsmuster, anstatt auf der Codebehind-Seite (Code des Views dahinter). – Chanchal

Antwort

0

Swap um die einzigen Attribute lesen auf jeder Zelle. So starten wie diese

dataGridView1.Rows[row.index].Cells[column.index].ReadOnly= true; 

dann auf die Schaltfläche klicken

dataGridView1.Rows[row.index].Cells[column.index].ReadOnly= false; 

Sie die ganze Zeile oder Spalte wie diese

dataGridView1.Rows[row.index].ReadOnly= false; 
dataGridView1.Columns[columns.index].ReadOnly= false; 

oder das gesamte Gitter einstellen

dataGridView1.ReadOnly = false; 
+0

@ Chanchal, ich bin mir nicht sicher, was Sie fragen – JSON

+0

Hier ist das Problem: Ich habe ein Raster mit einer Spalte mit einigen Daten und das kann bearbeitet werden, nachdem Benutzer auf die Schaltfläche Bearbeiten unter dem Raster klickt. Die Anforderung besteht darin, die Zellen im Raster nicht editierbar zu halten, bis auf die Schaltfläche Bearbeiten geklickt wird. Das gesamte Raster kann nicht deaktiviert werden, da die Bildlaufleiste aktiviert sein sollte, um durch die Zeilen zu blättern. – Chanchal

+0

@ Chanchal Ich schlage vor, dass Sie das Raster ReadOnly setzen. Dies ist anders als aktiviert. ReadOnly hält Dinge aktiviert, verhindert jedoch, dass der Benutzer den Text bearbeiten kann. Bildlaufleisten funktionieren weiterhin. – JSON