2014-09-02 11 views
5

अक्षम करें हाय वहाँ मैं शुरुआती प्रोग्रामर हूं और WPF के लिए नया हूं और एक साधारण सवाल है, लेकिन मैंने इसे खोजने में काफी समय बिताया है, इसे समझ नहीं पाया जा सकता है, इसलिए मुझे आशा है कि आप लोग करेंगे मेरी मदद करो। मैं चाहता हूं कि मेरे डेटाग्रिड में एक संदर्भ मेनू में मेनू आइटम को अक्षम करना है। उदाहरण के लिए: यदि एक से अधिक पंक्तियों datagrid में चयन किया है, को निष्क्रिय एक संदर्भ मेनू आइटम "गुण"डब्ल्यूपीएफ डाटाग्रिड पंक्ति संदर्भ मेनू - मेनू आइटम

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

- अक्षम प्रसंग मेनू आइटम

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

उत्तर

2

यह एक तरीका है इसके बारे में जाना है। यह थोड़ा गंदा है लेकिन काम करता है।

पहले कि 1 का अर्थ सक्षम (सही) कहने के लिए एक IValueConverter बना सकते हैं और मूल्य कनवर्टर इस

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

की तरह लग रहे हो सकता है फिर अपने 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> 

और आखिरकार ग्रिड की चयनित इटम्स गिनती को 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

WPF Command pattern implementation पर एक नजर डालें। एक आदेश इंगित कर सकता है कि CanExecute विधि को कार्यान्वित करके कोई कार्रवाई संभव है या नहीं। CanExecuteChanged ईवेंट की सदस्यता ले सकते हैं और अक्षम हो सकते हैं यदि CanExecute गलत लौटाता है या सक्षम हो सकता है यदि CanExecute सत्य लौटाता है

आप आसानी से एमएसडीएन पृष्ठ से कोड को अपनी आवश्यकताओं के अनुसार अनुकूलित कर सकते हैं।

<MenuItem x:Name="RowContMenuProp" Header="Properties" 
      Command="local:ApplicationsCmd.ShowProperties" 
      CanExecute="ShowPropertiesCanExecute" 
      Executed="ShowPropertiesExecuted" > 
कोड में

तब:

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 
संबंधित मुद्दे