2011-08-19 68 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看过“国家”这样的东西,我会尽量与他们“做饭”。 –

相关问题