【发布时间】:2017-11-25 22:19:55
【问题描述】:
我正在尝试在 WPF 中完成正确的 MVVM 架构。
我有一个播放器,在“模型”部分有一个布尔属性,表示我们现在是否正在“播放”。
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 属性放在模型部分,但这不是“业务逻辑”,所以我认为这不是正确的方法。
我还考虑过使用转换器并将IconButton 直接绑定到“IsPlaying”,这可能会起作用,但我在这里读到:How can WPF Converters be used in an MVVM pattern? 你根本不应该在 MVVM 中使用转换器,因为你可以做任何事情在“ViewModel”部分中进行所需的转换。
在 MVVM 架构中实现此目的的最佳方法是什么?
【问题讨论】:
-
您从哪里得到“这不是您的做法”的想法? ViewModel 通常实现 INotifyPropertyChanged。我会说模型这样做实际上并不常见,但您显然已经这样做了。如果你这样做,那么你将不得不在视图模型中订阅模型的 PropertyChanged 事件并引发适当的更改相关属性。另一种方法是仅绑定到模型对象并使用 DataTrigger 根据 IsPlaying 的状态更改图像源。
-
“你从哪里得到这个想法的......” - 我在 youtube 上看到了一个例子。 “你必须订阅模型的 PropertyChanged 事件......” - 我该怎么做? “...并使用 DataTrigger 根据 IsPlaying 的状态更改图像源” - 这是什么意思,我该怎么做?