【问题标题】:Dynamic VIew? where to put logic?动态视图?把逻辑放在哪里?
【发布时间】:2013-04-06 03:17:01
【问题描述】:
我目前正在使用 MVVM 模式进行编程。
我的视图模型看起来像这样
class DoorsViewModel
{
ObservableCollection<Door> doorCollection;
};
门类如下所示
class Door
{
string name;
bool isOpen;
};
我的视图链接到视图模型,并且只包含一个带有图片和门名称的 longlistselector。我希望图片是动态的,并根据门的状态(无论是打开还是关闭)而变化。我将如何实现它以使图片根据门的状态动态更新?这应该在视图模型中完成吗?还是应该在视图内完成?
【问题讨论】:
标签:
mvvm
windows-phone-8
mvvm-light
【解决方案1】:
这个逻辑应该在 ViewModel 中。所有与视图相关的逻辑或事物的显示方式都应该在 ViewModel 中。视图中不应包含任何逻辑 (.xaml.cs)。
您通常使用INotifyPropertyChanged 接口来通知视图发生了一些变化。在这种情况下,您希望在门状态更改时更改门图像。在这种情况下,我会尝试这样的事情。
class Door: INotifyPropertyChanged
{
private string _name;
private bool _isOpen;
public Uri DoorImage
{
get
{
if (_isOpen) return new Uri("uri_to_open.png");
return new Uri("uri_to_closed.png");
}
}
public bool IsOpen
{
get { return _isOpen; }
set
{
_isOpen = value;
RaisePropertyChanged("IsOpen");
// important, notifies the UI to update the door image
RaisePropertyChanged("DoorImage");
}
}
private void RaisePropertyChanged(string propertyName)
{
var tmp = PropertyChanged;
if (tmp != null) tmp(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
};
注意:我已将字段封装到属性中。
如果您的图片嵌入到您的程序集中,请查看此link 了解如何为您的图片编写 uri。