我正在开发一个应用程序。它可以处于两种状态(已连接和已断开)。我的MainViewModel中有一个布尔属性,用于跟踪当前状态。
我的应用程序中有很多其他视图(和ViewModels)。当应用程序进入Disconnected状态时,我需要在每个视图中禁用几个控件(不是全部)。当应用程序处于连接状态时,显然我需要启用相同的控件。
我想知道实现这个目标的好方法是什么?
答案 0 :(得分:1)
我猜您只有MainViewModel
的一个实例。
通过静态属性公开此唯一实例,甚至将其设为单例。
通过这种方式,您可以轻松地在视图之间共享您的连接状态。
using System.ComponentModel;
namespace WpfMagic
{
public class MainViewModel : INotifyPropertyChanged
{
private static readonly MainViewModel instance = new MainViewModel();
public static MainViewModel Instance { get { return instance; } }
private bool isConnected;
public bool IsConnected
{
get { return isConnected; }
set
{
if (value != isConnected)
{
isConnected = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsConnected"));
}
}
}
private MainViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
}
棘手的部分是静态绑定,但其他方面很简单:
您的第一个观点:
<Button IsEnabled="{Binding Path=(local:MainViewModel.Instance).IsConnected}">Send Spams</Button>
另一个:
<Button IsEnabled="{Binding Path=(local:MainViewModel.Instance).IsConnected}">DDOS SO</Button>
最后一个:
<Button IsEnabled="{Binding Path=(local:MainViewModel.Instance).IsConnected}">Open Lol Cats Videos</Button>
要测试它,您可以在另一个视图中使用CheckBox
:
<CheckBox IsChecked="{Binding Path=(local:MainViewModel.Instance).IsConnected}">Is Connected?</CheckBox>
答案 1 :(得分:0)
您可以使用ViewModelLocator并在其中包含单个MainViewModel。这将允许您从任何ViewModel访问MainVM。从那里直接访问所需的布尔属性。
希望这会有所帮助。 ViewModelLocator IOC Containers,MVVM ViewModelLocator
答案 2 :(得分:0)
Viewmodel定位器模式是一个选项,而不是一个坏选项。
我建议安装来自nuget的mvvm灯,因为它会为你插入模板。
另一种方法是使用mvvm light的消息传递框架。在这种情况下,您的主视图模型会在您的状态发生变化时发出消息,其他视图模型(假定绑定到您的视图)可以订阅。
这样做的好处是每个视图模型都可以以任何方式响应该行为。对于那些只需要bool进行绑定的人,创建一个基本视图模型,该模型注册到消息并更新属性。对于您可能想要更改的其他视图模型,可以执行命令绑定或更新标签等。