2010-09-21 24 views
42

Theo các mục menu mặc định sẽ bị tắt khi lệnh của nó không thể được thực hiện (CanExecute = false). Cách dễ nhất để làm cho mục menu hiển thị/thu gọn dựa trên phương thức CanExecute là gì?WPF - cách ẩn mục menu nếu lệnh CanExecute của lệnh là sai?

Cảm ơn

thuận tiện cho bạn ở đây là giải pháp: Ràng buộc sở hữu tầm nhìn đến tài sản IsEnabled sử dụng "Boolean để Visibility" chuyển đổi.

+1

Ohhhh - thật đơn giản! Tuyệt vời lừa! – sergtk

Trả lời

40

Bạn có thể chỉ cần ràng buộc Hiển thị thành IsEnabled (được đặt thành false trên CanExecute == false). Bạn vẫn cần một IValueConverter để chuyển đổi bool thành visible/collapse.

public class BooleanToCollapsedVisibilityConverter : IValueConverter 
    { 
     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      //reverse conversion (false=>Visible, true=>collapsed) on any given parameter 
      bool input = (null == parameter) ? (bool)value : !((bool)value); 
      return (input) ? Visibility.Visible : Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 
+1

Duh! Tất nhiên. Cảm ơn rất nhiều. –

+3

Đây là một nỗ lực nhiều hơn cần thiết, bạn chỉ có thể sử dụng một kích hoạt – rjarmstrong

1

Tôi không biết đây có phải là cách dễ nhất hay không, nhưng bạn luôn có thể tạo thuộc tính trả về CanExecute() và sau đó ràng buộc khả năng hiển thị của phần tử với thuộc tính này bằng cách sử dụng IValueConverter để chuyển boolean thành Visibility.

+0

Câu trả lời này không giúp được gì nhiều, nhưng tôi đưa nó lên 1 mức độ tiêu cực mà tôi hoàn toàn không hiểu tại sao ai đó đã đưa ra. Trong khi câu trả lời này không phải là quá hữu ích, TẤT CẢ những điều được đề cập trong nó là VALID và hơn nữa, tất cả các câu trả lời tích cực đánh dấu khác DO SỬ DỤNG những điều được đề cập. Giá trị điểm thấp nhất mà câu trả lời này xứng đáng là số không, không phải âm bản! – quetzalcoatl

+0

Đây là suy nghĩ ban đầu của tôi, nhưng làm cách nào bạn có thể truy cập vào tham số (đối tượng param) từ bên trong thuộc tính mới này và chuyển nó tới CanExecute()? – Matt

43

Cảm ơn giải pháp. Đối với những XAML rõ ràng muốn này có thể giúp:

<Window.Resources> 
     <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Window.Resources> 

<ContextMenu x:Key="innerResultsContextMenu"> 
    <MenuItem Header="Open" 
       Command="{x:Static local:Commands.AccountOpened}" 
       CommandParameter="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" 
       CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" 
       Visibility="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource booleanToVisibilityConverter}}" 
       /> 
</ContextMenu> 

Trong trường hợp của tôi, menu ngữ cảnh là một nguồn lực, do đó bắt buộc đối với khả năng hiển thị phải sử dụng các thiết lập RelativeSource tự ràng buộc.

Là một bên, đối với CommandParameter, bạn cũng có thể chuyển DataContext của mục được bấm để mở menu ngữ cảnh. Và để định tuyến các ràng buộc lệnh đến cửa sổ cha, bạn sẽ cần phải đặt CommandTarget tương ứng.

+0

Câu trả lời tuyệt vời chính xác những gì tôi cần – Gilad

40
<Style.Triggers> 
    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
    </Trigger> 
</Style.Triggers> 

CanExecute Toggles IsEnabled tài sản vì vậy chỉ cần xem này và giữ mọi thứ trong giao diện người dùng. Tạo một phong cách riêng nếu bạn muốn sử dụng lại nó.

+0

Điều này là hoàn hảo - làm việc như một say mê (mặc dù tôi đã sử dụng một ràng buộc trực tiếp với một bool để hiển thị chuyển đổi thay vì kích hoạt, ý tưởng là như nhau) –

+1

+1 Đây là giải pháp tốt nhất! Và phải có dấu kiểm màu xanh lá cây – GETah

+7

Chế độ hiển thị phải được đặt thành 'Đã thu gọn' vì nếu không, mục menu ẩn sẽ vẫn chiếm không gian. –

Các vấn đề liên quan