将按钮的样式绑定到WP7中的ViewModel属性

时间:2011-08-19 13:43:27

标签: c# silverlight windows-phone-7 mvvm styles

我在AudioRecord View中有一个播放按钮。

目前它被判定为:

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

当用户单击该按钮时,将执行项目ViewModel中的PlayStopCommand。我希望按钮在播放声音时将其样式设置为“RoundStop”。

如何将按钮的样式绑定到我的ViewModel中的属性(我应该使用哪种属性类型),以便按钮的外观可以从代码中控制?

我定义了RoundStop样式,我只需要一种方法将其应用于代码中的按钮。

2 个答案:

答案 0 :(得分: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}"
            />

答案 1 :(得分:0)

您可以使用ToggleButton并在视觉状态中进行必要的视觉更改以进行选中/取消选中。

如果您必须按照问题所述的方式执行此操作,那么您可以在资源中定义样式,然后在代码隐藏中从this.Resources["YourStyleKey"];访问它。您的问题将会得到它从视图到视图模型,因此我的第一个建议是:)