2011-04-18 155 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}}" >