c# - Botón dentro de DataGrid wpf MVVM
events (1)
El parámetro de comando de eliminación debería ser
CommandParameter="{Binding}"
esto significa que el parámetro de comando es la referencia del documento en sí, por lo que puede hacer lo siguiente en su comando
yourDocumentObservableCollection.Remove (CommandParameter)
De esta forma, no tendrá que preocuparse si el documento está enfocado o no.
Estoy siguiendo MVVM en este proyecto.
Tengo WPF datagrid,
ItemsSource (ItemsSource="{Binding Documents}")
enlazado a un ObservableCollection<Document>
,
SelectedItem (SelectedItem="{Binding CurrentDocument, Mode=TwoWay}")
WorkQueueDocument
a WorkQueueDocument
,
También utilicé Disparadores de interacción para capturar el doble clic del mouse, para cargar el documento seleccionado en una nueva ventana.
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding ShowViewerCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
He definido / vinculado las columnas de mi cuadrícula de datos a los atributos correspondientes de la clase WorkQueueDocument.
<DataGrid.Columns>
<DataGridTextColumn Width="Auto"
MinWidth="100"
Header="Name"
Binding="{Binding Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="2,0,0,0" />
<Setter Property="ToolTip" Value="{Binding Name}" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!-- Many Other Columns Here... -->
</DataGrid.Columns>
<DataGrid.ColumnHeaderStyle>
<!-- I have various designer style''s properties defined here -->
</DataGrid.ColumnHeaderStyle>
Se supone que debo cargar el documento cuando el usuario selecciona la fila (documento) en la cuadrícula, ya que la propiedad CurrentDocument se define de la siguiente manera:
public WorkQueueDocument CurrentDocument
{
get
{
return this.currentDocument;
}
set
{
if (this.currentDocument != value)
{
this.currentDocument = value;
this.OnPropertyChanged("CurrentDocument");
this.IsDocumentSelected = true;
// If we are in progress already, don''t do anything
if (!IsLoading && this.currentDocument != null)
{
IsLoading = true;
LoadDocumentBackgroundWorker();// loading documenting async
}
if (this.currentDocument == null)
{
this.IsDocumentSelected = false;
}
}
}
}
Ahora, el problema es: quiero agregar una columna del botón Eliminar a esta cuadrícula de datos, de modo que cuando el usuario presione el botón Eliminar, el documento se elimine directamente sin cargar el documento. Agregué siguiente xaml a <DataGrid.Columns>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Name="DeleteBatch"
Content="Delete"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DeleteCommand}"
CommandParameter="Delete"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Este DeleteCommand
no es despedido. Traté de averiguar POR QUÉ y descubrí que tengo
El primer comando está en la cuadrícula de datos para cargar el documento en la selección de la fila
ItemsSource="{Binding Documents}"
El segundo comando está en el botón de borrar que se encuentra en la columna de la cuadrícula de datos anterior
<Button Name="Delete"
Content="Delete"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DeleteCommand}"
CommandParameter="Delete">
, Puedo acceder solo a un comando a la vez. Cuando hago clic en el botón, la fila ('' obviamente '') se selecciona y ejecuta el enlace asociado para '' SelectedItem '', pero no realiza el seguimiento llamando al
DeleteCommand (que idealmente debería). Pero si elimino esta propiedad '' SelectedItem '' - se activa el deleteCommand (pero luego no obtengo la fila seleccionada).
Además (mientras se detectaba la eliminación de errores) el ** DeleteCommand se ejecuta cuando presionamos (clic) por segunda vez (porque ahora la fila ya está seleccionada) **
Busqué en Google y encontré pocas soluciones probables , como Enlace prioritario y Túnel, pero no pude implementar. Por favor, guíame a través de esto.
Obtuve este enlace , pero no estoy seguro de si esta es la única forma.
PD: 1. Estoy usando WPF, .Net 4.0 y MVVM
- No sugiera soluciones de terceros. [a menos que sea la única opción]