根据MainViewModel中的状态启用/禁用不同视图上的控件的最佳方法

时间:2014-08-12 20:19:41

标签: c# wpf mvvm

我正在开发一个应用程序。它可以处于两种状态(已连接和已断开)。我的MainViewModel中有一个布尔属性,用于跟踪当前状态。

我的应用程序中有很多其他视图(和ViewModels)。当应用程序进入Disconnected状态时,我需要在每个视图中禁用几个控件(不是全部)。当应用程序处于连接状态时,显然我需要启用相同的控件。

我想知道实现这个目标的好方法是什么?

3 个答案:

答案 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 ContainersMVVM ViewModelLocator

答案 2 :(得分:0)

Viewmodel定位器模式是一个选项,而不是一个坏选项。

我建议安装来自nuget的mvvm灯,因为它会为你插入模板。

另一种方法是使用mvvm light的消息传递框架。在这种情况下,您的主视图模型会在您的状态发生变化时发出消息,其他视图模型(假定绑定到您的视图)可以订阅。

这样做的好处是每个视图模型都可以以任何方式响应该行为。对于那些只需要bool进行绑定的人,创建一个基本视图模型,该模型注册到消息并更新属性。对于您可能想要更改的其他视图模型,可以执行命令绑定或更新标签等。