WPF中的动态视图

本文关键字:视图 动态 WPF | 更新日期: 2023-09-27 18:11:13

我正在尝试动态更改ObservableCollection中定义的UserControl视图。

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});

显然,当创建一个视图的新对象,然后将其分配给网格上的子对象时,会出现一个问题-它会给我一个类型错误。

我试过这样做:

_items[0].MView = new UserControl(); // I know this wouldn't work

我的主要问题是,有没有人尝试过实现这样的东西,你是如何绕过它的?

谢谢

WPF中的动态视图

正如@HighCore所指出的,WPF允许以一种更好的方式动态决定要显示的视图,同时保持关注点分离,这样您就不会将视图逻辑与业务逻辑混合在一起。而MVVM是实现这一目标的可靠方法。

本质上,你想要做的是为你想要显示的每个"东西"创建一个ViewModel。然后,为每个ViewModel(即视图)创建一个DataTemplateDataTemplate可以是自包含的,也可以只指向UserControl。然后,你使用一个ContentPresenter,它是绑定到一个CurrentItem属性,或者别的什么,当你设置CurrentItem到一个特定的ViewModel, WPF将为你找到适当的DataTemplate(视图),并相应地显示它。

在网上有几个演练演示了这一点,在StackOverflow上也有几个这种模式的例子。一个例子,似乎非常接近你所要求的是在这里:使用MVVM之间切换视图/用户控件。