好的,所以我一直在尝试学习一些MVVM。它只用了三天就走到了尽头。应用程序只需检索客户端的外部IP地址,并在我的UI中找到的标签中更新新的IP地址。然而,不仅仅是采用老式的简单方式,
ipAdd.Content = getNewIp();
结束故事就在那里结束。相反,我决定使用一些MVVM来实现以下目标:
我选择使用更多MVVM的原因是使用UpdateSourceTrigger
和UpdateCommand
。基本上,当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的做法,我试着融入我的方式,虽然没有运气。
有没有办法做到这一点,或者甚至更好,如果以这种方式完成?