2014-09-02 27 views
5

Hi There Sono un programmatore principiante e nuovo a WPF e ho una semplice domanda, ma ho passato un po 'di tempo a cercarlo e non riuscivo a capirlo, quindi spero che voi ragazzi aiutami. Tutto ciò che voglio è disabilitare la voce di menu in un menu di scelta rapida nel mio Datagrid. per esempio: se più di un file selezionato in DataGrid, disattivare una voce di menu contestuale "Proprietà"Menu di scelta rapida riga Datagrid WPF - Disabilita la voce di menu

<DataGrid.Resources> 
    <ContextMenu x:Key="DataRowContextMenu"> 
      <MenuItem x:Name="RowContMenuProp" Header="Properties"> 
       <MenuItem.Icon> 
        <Image Source="Resources/proporties.ico" Height="16" Width="16" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      <Separator Margin="0" /> 
      <MenuItem Header="Copy" Command="Copy" > 
       <MenuItem.Icon> 
        <Image Source="Resources/copy.ico" Height="16" Width="16" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      <MenuItem Header="Remove from list" Click="MenuItem_Click_1" > 
       <MenuItem.Icon> 
        <Image Source="Resources/cut.png" Height="16" Width="16" /> 
       </MenuItem.Icon> 
      </MenuItem> 
      <MenuItem Header="Remove from project" Click="MenuItem_Click_2" > 
       <MenuItem.Icon> 
        <Image Source="Resources/remove.ico" Height="16" Width="16" /> 
       </MenuItem.Icon> 
      </MenuItem> 
    </ContextMenu> 
</DataGrid.Resources> 

<DataGrid.RowStyle > 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Setter Property="ContextMenu" Value="{StaticResource DataRowContextMenu}" /> 
     <Setter Property="BorderThickness" Value="0"/> 
    </Style> 
</DataGrid.RowStyle> 

- disabilitare la voce di menu contestuale

Private Sub datagrid1_MouseUp(sender As Object, e As MouseButtonEventArgs) 
     If datagrid1.SelectedItems.Count > 1 Then 

risposta

2

questo è un modo per andare su di esso. È un po 'sporco ma funziona.

prima creare un IValueConverter dire che 1 mezzi consentono (vero) e il convertitore di valori può assomigliare a questo

public class OneReturnsTrueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (int)value == 1; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Quindi salvare un riferimento al DataGrid nella vostra DataGridRow

<DataGrid.RowStyle > 
    <Style TargetType="{x:Type DataGridRow}"> 
     <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" /> 
     <Setter Property="ContextMenu" Value="{StaticResource DataRowContextMenu}" /> 
     <Setter Property="BorderThickness" Value="0"/> 
    </Style> 
</DataGrid.RowStyle> 

E infine associare il numero SelectedItems della griglia alla proprietà IsEnabled

<DataGrid.Resources> 
    <myConverters:OneReturnsTrueConverter x:Key="OneReturnsTrueConverter"/> 
    <ContextMenu x:Key="DataRowContextMenu"> 
     <MenuItem x:Name="RowContMenuProp" Header="Properties" 
        DataContext="{Binding Parent.PlacementTarget.Tag , RelativeSource={RelativeSource Self}}" 
        IsEnabled="{Binding Path=SelectedItems.Count, Converter={StaticResource OneReturnsTrueConverter}}" /> 
    </ContextMenu> 
</DataGrid.Resources> 
1

Date un'occhiata al WPF Command pattern implementation. Un comando può indicare se un'azione è possibile implementando il metodo CanExecute. Un pulsante può iscriversi all'evento CanExecuteChanged e essere disabilitato se CanExecute restituisce false o essere abilitato se CanExecute restituisce true.

È possibile adattare facilmente il codice dalla pagina MSDN alle proprie esigenze.

<MenuItem x:Name="RowContMenuProp" Header="Properties" 
      Command="local:ApplicationsCmd.ShowProperties" 
      CanExecute="ShowPropertiesCanExecute" 
      Executed="ShowPropertiesExecuted" > 

Poi nel codice:

Private Sub ShowPropertiesExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs) 
    ... 
End Sub 

Private Sub ShowPropertiesCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs) 
    e.CanExecute = ...set to True when your condition is met 
End Sub