我試圖在WPF中實現正確的MVVM體系結構。 我有一個玩,在「模型」部分有一個布爾屬性,說如果我們現在「玩」。綁定到使用更改屬性的屬性
public bool IsPlaying
{
get
{
return isPlaying;
}
set
{
isPlaying = value;
OnPropertyChanged("IsPlaying");
}
}
(請注意,我實現了 「INotifyPropertyChanged的」 接口)在我的ViewModel
,我有一個名爲 「ToggleButtonIcon」 一個ImageSource的屬性:
public ImageSource ToggleButtonIcon
{
get
{
if (Model.IsPlaying)
return pauseIcon;
else
return playIcon;
}
}
其中我綁定到「切換播放「按鈕在視圖中:
<cc:IconButton x:Name="TogglePlayButton"
Style="{StaticResource playButton}"
ImageSource="{Binding Path=ToggleButtonIcon,
UpdateSourceTrigger=PropertyChanged}"
Command="{Binding Path=TogglePlayCommand}"/>
(這是一個自定義控件,但它的工作,我che cked) 當然,我希望按鈕根據是否正在播放(暫停)以及是否正在播放(播放)來更改圖像圖標。
問題是ToggleButtonIcon
不通知它何時更改,我無法在ViewModel部分實現INotifyValueChanged
,因爲a。我明白那不是你怎麼做的,b。我不知道它何時發生變化,因爲它取決於Model的IsPlaying
屬性。
我曾考慮將ToggleButtonIcon
屬性放在模型部分,但這不是「業務邏輯」,所以我認爲這不是正確的做法。
我也想過用轉換器和綁定IconButton
直接「IsPlaying模塊」,這可能會工作,但我讀到這裏:How can WPF Converters be used in an MVVM pattern?,你不應該在使用轉換器都在MVVM,因爲你可以做你想做的任何皈依在「ViewModel」部分。
在MVVM體系結構中完成此操作的最佳方法是什麼?
你從哪裏得到的想法:「這不是你怎麼辦呢?」 ViewModels通常實現INotifyPropertyChanged。我會說這對於模型來說實際上並不常見,但你顯然是這麼做的。如果你這樣做,那麼你將不得不在視圖模型中訂閱模型的PropertyChanged事件,並引發相應的更改相關屬性。另一種方法是綁定到模型對象,並使用DataTrigger根據IsPlaying的狀態更改圖像源。 –
「你從哪裏得到這個主意......」 - 我在YouTube上看到過一個例子。 「你將不得不訂閱模型的PropertyChanged事件......」 - 我該怎麼做? 「...並使用DataTrigger根據IsPlaying的狀態更改圖像源」 - 這是什麼意思,我該怎麼做? –