2016-04-04 3 views
-1

Я хочу отключить (закрыть для редактирования) третий столбец моей dataGrid (с использованием MVVM-WPF), но хочу, чтобы разрешить снова редактировать за пределами сетки. Как я могу это достичь? Задача, с которой я столкнулся, заключается в том, как получить свойство dataGrid при нажатии кнопки, я использую здесь шаблон команды. Вот как выглядит мой ViewModel сейчас, то, что я должен написать в этом методе, чтобы сделать редактирование определенного столбца:Я хочу, чтобы конкретный столбец моего DataGrid редактировался при нажатии кнопки

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; 

     } 
    } 

Это как мой Customcommand выглядит:

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); 
     } 
    } 

Мой Вид:

<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

С моя сетка читается только при загрузке представления. Я хочу m ake его можно редактировать, нажав кнопку «Редактировать», используя шаблон команды, вместо того, чтобы делать это на странице codebehind (View's code behind). – Chanchal

ответ

0

своп вокруг только для чтения атрибутов каждого с флигель. Так начните, как этот

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

затем на кнопку мыши

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

вы можете установить всю строку или столбец, как этот

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

или всей сетки

dataGridView1.ReadOnly = false; 
+0

@ Chanchal, я не уверен, что вы просите – JSON

+0

Вот проблема: у меня есть сетка с столбцом, имеющим некоторые данные, и который можно редактировать после того, как пользователь нажимает кнопку «Изменить» под сеткой. Требование состоит в том, чтобы держать ячейки в сетке неизменяемыми до тех пор, пока не будет нажата кнопка «Редактировать». Вся сетка не может быть отключена, так как полоса прокрутки должна быть включена для прокрутки строк. – Chanchal

+0

@ Chanchal Я предлагаю вам установить сетку в ReadOnly. Это отличается от параметра «Включено». ReadOnly поддерживает все функции, но не позволяет пользователю редактировать текст. Полосы прокрутки будут работать. – JSON