gpt4 book ai didi

c# - 如何在 MVVM 中更改属性时更新 UI 更改

转载 作者:行者123 更新时间:2023-11-30 12:21:05 30 4
gpt4 key购买 nike

我正在尝试在 WPF 中实现正确的 MVVM 架构。

我有一个播放器,在“模型”部分有一个 bool 属性,表示我们现在是否正在“播放”。

public bool IsPlaying
{
get
{
return isPlaying;
}
set
{
isPlaying = value;
OnPropertyChanged("IsPlaying");
}
}

(注意我实现了“INotifyPropertyChanged”接口(interface),所以 OnPropertyChanged 函数会报告更改)

在我的 ViewModel 中,我有一个名为“ToggleButtonIcon”的 ImageSource 属性:

public ImageSource ToggleButtonIcon
{
get
{
if (Model.IsPlaying)
return pauseIcon;
else
return playIcon;
}
}

我绑定(bind)到 View 中的“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。我不知道它什么时候改变,因为它取决于模型的 IsPlaying 属性。

我考虑过将 ToggleButtonIcon 属性放在模型部分,但这不是“业务逻辑”,所以我认为这不是正确的方法。

我还考虑过使用转换器并将 IconButton 直接绑定(bind)到“IsPlaying”,这可能会起作用,但我在这里阅读:How can WPF Converters be used in an MVVM pattern?你根本不应该在 MVVM 中使用转换器,因为你可以在“ViewModel”部分中进行任何你想要的转换。

在 MVVM 架构中实现这一目标的最佳方式是什么?

最佳答案

对我来说,IsPlaying 应该在 ViewModel 中,并实现了更改通知,因为它代表了某种应用程序状态。

要解决此问题,我建议将 ToggleButtonIcon 从 ViewModel 中取出,并在 IconButton 控件上创建一个 DataTrigger(通过其Style),它绑定(bind)到 IsPlaying 属性(在 ViewModel 上)并根据它更改 ImageSource 属性。

关于c# - 如何在 MVVM 中更改属性时更新 UI 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47491054/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com