2011-02-16 145 views
2

我想創建一個菜單項,但顯示的文本取決於視圖模型的屬性。 如果屬性IsPlaying爲真,MenuItem文本應該是「暫停」,否則應該是「播放」。如何使WPF內容對某些綁定數據有條件?

如果沒有這個條件,該菜單項應該是這樣的:

<MenuItem Header="_Play" Command="{Binding Path=PlayCommand}" /> 

但是,「播放」和「暫停」應該互換(如果可能的話PlayCommand應該PauseCommand互換過,但是這可以通過工作在PlayCommand中同時具有PlayCommand和PauseCommand的邏輯)

回答

3

要做到這一點最簡單的方法是首先你應該Header綁定到您的視圖模型一個string Caption屬性返回播放或暫停基於對IsPlaying價值和實現INotifyPropertyChanged。在此之後,當IsPlaying被更改時,也只需更改Caption的通知。

雖然你可以使用一個轉換器,但在這種情況下,這將是一個矯枉過正。

+0

我第一次投票贊成轉換答案,但我想我最終會選擇這個。雖然看起來相對簡單,但這個解決方案可能是最簡單,最快速的 – David 2011-02-16 10:02:29

1

這是最好的轉換器。您的代碼將是這個樣子:

<UserControl xmlns:myConverters="MyRandomNamespace"> 
    <UserControl.Resources> 
     <myConverters:MyMenuTextConverter x:Key="MyMenuTextConverter" /> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot"> 
     <TextBlock Text="{Binding IsPlaying, Converter={StaticResource MyMenuTextConverter }}" /> 
    </Grid> 

</UserControl> 

,並在轉換器:

namespace MyRandomNamespace 
{ 
    public class MyMenuTextConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if ((bool) value == true) 
       return "Pause"; 

      return "Play"; 
     } 
    } 
} 

我已經使用了TextBlock顯示背後的聯結概念,所有你需要做的就是使用相同的綁定在MenuItem的適當屬性上的語法。我還從轉換器返回不是最佳的文本文本(我個人喜歡我的文本轉換器從字符串資源文件中檢索它們的值,以便我的應用程序能夠識別文件),但您明白了。

+1

將字符串烘焙到轉換器中的另一種替代方法(實際上'非最優'* grin *)是在轉換器上定義TrueText和FalseText屬性,然後可以在XAML轉換器資源中指定它們。這可以與資源檢索(TrueResourceKey和FalseResourceKey)相結合,以保持轉換器代碼的可重用性而不會影響本地化。 – itowlson 2011-02-16 07:14:26

1

一對夫婦的方式做到這一點:

  1. 使用觸發器。在IsPlaying = True上設置觸發器,並分別將Header和Command設置爲Pause和PauseCommand。
  2. 有兩個菜單項,播放和暫停,並根據IsPlaying使用一對觸發器設置其可見性。 (你也可以數據綁定可見性,但是使用觸發器避免了需要定義一個BooleanToInvisibilityConverter。)
+0

+1選項1;當然,他們都會工作,就像轉換器一樣,但觸發器是乾淨的,同時解決了命令問題。 – kiwipom 2011-03-14 09:11:45

1

在WPF中,你可以使用一個DataTrigger改變基於狀態的內容在您的視圖模型(你甚至可以使用這個技術來換出模板)。另一種選擇是使用VisualStateManager(爲Silverlight不存在而創建的遠程數據觸發器的表親,然後將其返回給WPF)以執行從一個狀態(IsPlaying)到下一個(!IsPlaying)的類似更改。

我想提供一個更詳細的例子,但它已經過去了我的睡前時間。今天晚些時候。