内容

时间:2016-08-16 17:22:57

标签: c# wpf mvvm data-binding

好的,所以我一直在尝试学习一些MVVM。它只用了三天就走到了尽头。应用程序只需检索客户端的外部IP地址,并在我的UI中找到的标签中更新新的IP地址。然而,不仅仅是采用老式的简单方式,

ipAdd.Content = getNewIp();

结束故事就在那里结束。相反,我决定使用一些MVVM来实现以下目标:

  • 检索IP地址,然后以标签
  • 将其显示给用户
  • 查询数据库并更新用户的IP地址
  • 冲洗,每五分钟重复一次。

我选择使用更多MVVM的原因是使用UpdateSourceTriggerUpdateCommand。基本上,当ip地址更新时,我想用它做一些事情(如上所述)。我在许多教程中看到过,UpdateCommand用于按钮,而UpdateSourceTrigger用于输入框,但没有任何内容显示如何使用标签进行操作,但它似乎应该绑定在同样的概念;它可能不是明确的被点击的按钮,而是一些执行和执行与按钮相同的任务的后退代码。对于初学者来说,到目前为止我所拥有的是:

模型

namespace IPdevices
{
    class IP : INotifyPropertyChanged
    {
        private string _add;
        public string add
        {
            get
            {
                return _add;
            }
            set
            {
                _add = value;
                OnPropertyChange("add");
            }
        }

        private void OnPropertyChange(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

视图模型

namespace IPdevices
{
    class IPViewModel
    {
        private IP _ip;

        public IPViewModel()
        {
            UpdateCommand = new IPUpdateCommand(this);
        }


        public ICommand UpdateCommand
        {
            get; private set;
        }

        public bool CanUpdate
        {
            get
            {
                return true; // just say yes for now
            }
        }

        public IP IP
        {
            get
            {
                return _ip;
            }
            set
            {
                _ip = value;
            }
        }

        public void updateClientIp()
        {
            Console.WriteLine("_updating client ip and query database");
        }
    }
}

的ICommand

namespace IPdevices
{
    class IPUpdateCommand : ICommand
    {
        private IPViewModel _viewModel;
        public IPUpdateCommand(IPViewModel vm)
        {
            _viewModel = vm;
        }

        public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
            }
            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }

        public bool CanExecute(object parameter)
        {
            return _viewModel.CanUpdate;
        }


        public void Execute(object parameter)
        {
            _viewModel.updateClientIp();
        }
    }
}

主窗口

public Main()
{
    InitializeComponent();
    ipAdd.DataContext = new IPViewModel();
}

查看

<Label x:Name="ipAdd" Content="{Binding Path=IP.add}"/>

我在这里尝试实现的目标可以很容易地完成而不需要MVVM(也许是矫枉过正),只需调用一些帮助类来更新数据库端的用户ip,但是为了习惯MVVM的做法,我试着融入我的方式,虽然没有运气。

有没有办法做到这一点,或者甚至更好,如果以这种方式完成?

0 个答案:

没有答案