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>
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