我在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样式,我只需要一种方法将其应用于代码中的按钮。
答案 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"];
访问它。您的问题将会得到它从视图到视图模型,因此我的第一个建议是:)