我正在尝试动态更改UserControl
中定义的ObservableCollection
次观看。
public class MItem : INotifyPropertyChanged
{
private UserControl _mView;
public UserControl MView
{
get { return _mView; }
set
{
if (_mView != value)
{
_mView = value;
OnPropertyChanged("MView");
}
}
}
...
}
在另一个视图中我有:
ObservableCollection<MItem> _items = new ObservableCollection<MItem>;
_items.Add(new MItem{MView = MyView});
显然,当创建该视图的新对象然后将其分配给Grid上的子项时,这就成了一个问题 - 它会给我一个类型错误。
我尝试过类似的事情:
_items[0].MView = new UserControl(); // I know this wouldn't work
我的主要问题是,是否有人试图实施这样的事情,你是如何解决这个问题的?
由于
答案 0 :(得分:9)
正如@HighCore所指出的,WPF允许更好地动态确定要显示的视图,同时保持关注点分离,因此您不会将视图逻辑与业务逻辑混合。 MVVM是实现这一目标的经过验证的真正方法。
基本上,您要做的是为要显示的每个“事物”创建一个ViewModel。然后,为每个ViewModel创建一个DataTemplate
,即View。 DataTemplate
可以是自包含的,也可以只指向UserControl
。然后,使用DataBound的ContentPresenter
到CurrentItem属性,或者当你将CurrentItem设置为特定的ViewModel时,WPF会为你找到合适的DataTemplate
(View)并显示它相应
网上有几个演示证明了这一点,并且在StackOverflow上也有几个这种模式的例子。似乎与您要求的内容非常接近的一个示例是:Switching between Views/UserControls using MVVM。