【发布时间】:2021-08-21 21:29:10
【问题描述】:
我需要从class 中的方法调用更改View 上的Button 的Visibility。
我尝试通过在class 中公开VeiwModel 来访问它,然后成功地将Property“ShowRedHat”从真更改为假,但这不会更新Button 的可见性在视图中。这也会双重加载 ViewModel,这在我的解决方案中是不可接受的。
感谢任何帮助。
班级:
public class HatEngine
{
public void SetShowRedHat()
{
????.ShowRedHat = false;
}
}
ViewModel 中的属性:
public class MyViewModel : ObservableObject
{
private bool _showRedHat;
public bool ShowRedHat
{
get { return _showRedHat; }
set
{
OnPropertyChanged(ref _showRedHat, value);
}
}
}
视图中的按钮:
<Button Content="Red Hat"
Command="{Binding RedHatCommand}"
Visibility="{Binding ShowRedHat, Converter={StaticResource BoolToVis}}"/>
【问题讨论】:
-
为什么视图模型上的动作发生在一个完全不同的类中?视图模型应该控制其状态的变化;在内部或通过绑定到视图。如果 HatEngine 中的某些更改会导致您的视图模型发生更改,那么也许应该颠倒这种关系。这意味着视图模型应该具有对 HatEngine 类的引用,并且可能 HatEngine 类应该引发一个事件(或多个事件),视图模型使用该事件来更改任何必要的状态。
-
嗨@coding.monkey。两个方向都存在同样的问题。如果我在 HatEngine 中更改了一个属性,ViewModel 如何知道该属性已更改?谢谢
-
没有足够的信息来说明 HatEngine 在这个环境中扮演什么角色。是服务吗?它是另一个 ViewModel(似乎不是基于提供的代码,因为它不是从
ObservableObject派生的)。 假设它打算作为服务工作,有两种选择:直接从服务触发事件或使用事件聚合在两个类之间进行通信。下面我尝试了第一个选项;但是,更多信息将有助于找到真正的解决方案。
标签: class mvvm view properties viewmodel