2015-11-04 61 views
0

我必須創建一個上下文菜單,但它只應在最後一行啓用。在所有其他行中,它應該被禁用。我有1或x行。WPF,XAML Datagrid - 僅在最後一行啓用上下文菜單

<DataGrid.ContextMenu> 
    <ContextMenu> 
     <MenuItem Name="change_entry" Header="change entry"/> 
    </ContextMenu> 
</DataGrid.ContextMenu> 
+0

你如何填充您的數據網格?我認爲解決方案將取決於它。一些更多的代碼將有助於。 – Jose

回答

1

你可以ContextMenu.IsEnabled屬性綁定到DataGrid.SelectedIndexDataGrid.Items.Count性能與IMultiValueConverter。如果任何這個值發生了變化,它將會更新。這裏是XAML:

<Window x:Class="DataGridMenuTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:DataGridMenuTest" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <local:SelectedRowToBoolConverter x:Key="SelectedRowToBoolConverter"/> 
    </Window.Resources> 

    <Grid> 
     <DataGrid Name="MainGrid"> 
     <DataGrid.RowStyle> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="ContextMenu"> 
        <Setter.Value> 
         <ContextMenu> 
          <ContextMenu.IsEnabled> 
           <MultiBinding Mode="OneWay" Converter="{StaticResource SelectedRowToBoolConverter}"> 
            <Binding ElementName="MainGrid" Path="SelectedIndex"/> 
            <Binding ElementName="MainGrid" Path="Items.Count"/> 
           </MultiBinding> 
          </ContextMenu.IsEnabled> 

          <MenuItem Name="change_entry" Header="change entry"/> 
         </ContextMenu> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </DataGrid.RowStyle>   
    </DataGrid> 
    </Grid> 
</Window> 

這裏是落後轉換器代碼:

public class SelectedRowToBoolConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue) 
      return false; 

      int selectedIndex = (int)values[0]; 
      int rowsCount = (int)values[1]; 

      return (selectedIndex == rowsCount - 1); 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

非常好的解決方案,但是...如果您選擇一行並右鍵單擊列標題,它會失敗嗎?我認爲它會顯示上下文菜單 – Jose

+0

@Kirenenko然後,您可以將DataGridRow設置爲ContextMenu的父級而不是DataGrid。 – scarabun

+0

只是說,也許你應該編輯你的答案。 – Jose