2011-04-18 154 views
3

我有两个菜单项元素 - 具有互补可见性的“取消删除”和“删除”:当显示一个元素时,另一个元素被隐藏。将两个元素的可见性绑定到一个属性

在视图模型的代码,我有一个依赖属性FilesSelectedCanBeUndeleted定义如下:

private bool _filesSelectedCanBeUndeleted; 
public bool FilesSelectedCanBeUndeleted 
{ 
    get 
    { 
     return _filesSelectedCanBeUndeleted; 
    } 
    set 
    { 
     _filesSelectedCanBeUndeleted = value; 
     OnPropertyChanged("FilesSelectedCanBeUndeleted"); 
    } 
} 

的XAML的取消删除按钮看起来象下面这样:

<MenuItem Header="Undelete" Command="{Binding UndeleteCommand }" 
Visibility="{Binding Path=FilesSelectedCanBeUndeleted, 
Converter={StaticResource BoolToVisConverter}}" > 

正如你所看到的可视性的Undelete绑定到FilesSelectedCanBeUndeleted 属性(借助于一个BooleanToVisibilityConveter)。

现在我的问题是,如何编写XAML以将Delete按钮的可见性绑定到FilesSelectedCanBeUndeleted属性的“NOT”值?

感谢,

回答

4

Here是自定义IValueConverter的一个示例,它允许您反转可见性逻辑。基本上,当您的view-model属性为true时,其中一个MenuItem将可见,另一个将被折叠。

所以你需要定义转换器的两个实例,像这样:

<local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
<local:BooleanToVisibilityConverter x:Key="ReversedBooleanToVisibilityConverter" IsReversed="true" /> 
1

创建您的视图模型的新特性,只是否定“FilesSelectedCanBeUndeleted”,然后绑定到它。

+0

是的,这就是我现在所做的。它的工作原理,但我希望我能避免创造一个多余的财产。谢谢。 – sean717 2011-04-18 23:41:27

3

可以使用datatrigger适用于您菜单项,以避免这样在你viemodel另一个属性 -

 <MenuItem Header="Delete" 
        Command="{Binding DeleteCommand }"> 
      <MenuItem.Style> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Visibility" Value="Visible" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding FilesSelectedCanBeUndeleted}" Value="False"> 
          <Setter Property="Visibility" 
            Value="Collapsed" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </MenuItem.Style> 
     </MenuItem> 
0

我做了这样的事情在不久前用一个简单的否定......

private bool _filesSelectedCanBeUndeleted; 
public bool FilesSelectedCanBeUndeleted{  
     get{ 
      return _filesSelectedCanBeUndeleted;  
      } 
     set{   
      _filesSelectedCanBeUndeleted = value;   
      OnPropertyChanged("FilesSelectedCanBeUndeleted");  
      // You have also to notify that the second Prop will change 
      OnPropertyChanged("FilesSelectedCanBeDeleted");  
      }} 

public bool FilesSelectedCanBeDeleted{ 
     get{ 
      return !FilesSelectedCanBeUndeleted; 
     } 
     } 

Xaml可能看起来像这样......

<MenuItem Header="Delete" 
    Command="{Binding DeleteCommand }" 
    Visibility="{Binding Path=FilesSelectedCanBeDeleted, Converter={StaticResource BoolToVisConverter}}" >