2011-08-19 74 views
0

我在AudioRecord視圖中有一個播放按鈕。在WP7中綁定按鈕的樣式到ViewModel屬性

<Button Width="72" Height="72" Style="{StaticResource RoundPlay}" 
       DataContext="{Binding ElementName=this, Path=DataContext}" 
       cmd:ButtonBaseExtensions.Command="{Binding PlayStopCommand}" 
       /> 

當用戶點擊該按鈕,在項目一PlayStopCommand視圖模型被執行:

目前,因爲它是declered。每當聲音播放時,我都希望按鈕將其樣式設置爲「RoundStop」。

如何將按鈕的樣式綁定到ViewModel中的屬性(應該使用哪種屬性類型),以便按鈕的外觀可以從代碼中控制?

我定義了RoundStop樣式,我只是需要一種方法將它應用於代碼中的按鈕。

回答

1

你應該在你的viewmodel(播放/停止)中定義播放狀態,並使用轉換器將Button.Style綁定到該屬性。在您的轉換器中,根據當前狀態返回不同的樣式(取自App.Current.Resources)。

編輯:

這是你的轉換器的例子應該是這樣的:

public class StateStyleConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (PlaybackState)value == PlaybackState.Playing ? App.Current.Resources["RoundPlay"] : App.Current.Resources["RoundStop"]; 
    } 

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

在這個例子中,PlaybackState是一個枚舉:

public enum PlaybackState 
{ 
    Playing, 
    Stopped 
} 

那麼你應該加入state屬性添加到您的視圖模型(您通知更改的部分取決於您用於MVVM的框架):

private PlaybackState state; 
public PlaybackState State 
{ 
    get { return state; } 
    set 
    { 
     state = value; 
     RaiseNotifyPropertyChanged("State"); 
    } 
} 

聲明你的轉換器在XAML:

<UserControl.Resources> 
    <converters:StateStyleConverter x:Key="StateStyleConverter"/> 
</UserControl.Resources> 

最後將其綁定到該按鈕:

<Button Width="72" Height="72" Style="{Binding State, Converter={StaticResource StateStyleConverter}}" 
      DataContext="{Binding ElementName=this, Path=DataContext}" 
      cmd:ButtonBaseExtensions.Command="{Binding PlayStopCommand}" 
      /> 
+0

謝謝。如果你碰到一個例子,說明如何在演示項目中實現這個功能,請下載像這樣的下載。謝謝。 –

+1

不客氣!我編輯了這個問題,並附上了一個關於如何做到這一點的例子。希望能幫助到你。 – alf

+0

現在它清澈透明。謝謝! –

0

您可以使用ToggleButton並對視覺狀態進行必要的視覺更改以選中/取消選中。

如果必須做你的問題的狀態,那麼你可以定義在資源的樣式,然後訪問它的代碼隱藏從this.Resources["YourStyleKey"];你的問題會得到它從視圖到視圖模型的方式,因此我的第一個建議:)

+0

能否請你解釋一下你是什麼意思「你的問題將得到它視圖模型的視圖「。 –

+0

我只是說,如果您開始將視圖移交給視圖模型,以便您可以訪問資源,那麼分離視圖和視圖模型的好處將會失效。我的意思是在理想主義模式堅持感的「問題」:) –

+0

我明白了。謝謝。那麼,ToggleButton是一個不同的控制。我定義了一個複雜的按鈕模板,並且我不確定如果切換到ToggleButton,我不需要重新定義它的至少一些部分。我在Blend看過「國家」這樣的東西,我會盡量與他們「做飯」。 –

相關問題