我正在尝试在WPF中实现正确的MVVM架构。
我有一个播放器,在"Model"部分有一个布尔属性,用于表示我们当前是否正在"播放"。
public bool IsPlaying
{
get
{
return isPlaying;
}
set
{
isPlaying = value;
OnPropertyChanged("IsPlaying");
}
}
请注意,我实现了“INotifyPropertyChanged”接口,因此OnPropertyChanged
函数会报告更改。
在我的ViewModel中,我有一个名为“ToggleButtonIcon”的ImageSource属性:
public ImageSource ToggleButtonIcon
{
get
{
if (Model.IsPlaying)
return pauseIcon;
else
return playIcon;
}
}
我将它绑定到视图中的“TogglePlayButton”:
<cc:IconButton x:Name="TogglePlayButton"
Style="{StaticResource playButton}"
ImageSource="{Binding Path=ToggleButtonIcon,
UpdateSourceTrigger=PropertyChanged}"
Command="{Binding Path=TogglePlayCommand}"/>
它是一个自定义控件,但它是工作的,我已经检查过了。当然,我希望按钮根据播放状态(暂停)和未播放状态(播放)改变其图像图标。
问题在于ToggleButtonIcon
不通知更改,而且我无法在ViewModel部分实现INotifyValueChanged
,因为a. 我理解它不是MVVM结构的一部分,b. 我不知道何时更改,因为它取决于Model的IsPlaying
属性。
我考虑将ToggleButtonIcon
属性放在Model部分,但那不是“业务逻辑”,所以我认为那不是正确的方式。
我也考虑过使用转换器并直接将IconButton
绑定到“IsPlaying”,这可能有效,但我在这里读到:如何在MVVM模式中使用WPF转换器?,你根本不应该在MVVM中使用转换器,因为可以在“ViewModel”部分进行任何转换。
在MVVM架构中完成这项任务的最佳方法是什么?