0

我正在尝试动态更改UserControlObservableCollection.

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

我的主要问题是,有没有人尝试过实施这样的事情,你是如何解决的?

谢谢

4

1 回答 1

9

正如@HighCore 所指出的,WPF 允许以更好的方式动态确定要显示的视图,同时保持关注点分离,因此您不会将视图逻辑与业务逻辑混合。MVVM 是实现这一目标的行之有效的方法。

本质上,您要做的是为您要显示的每个“事物”创建一个 ViewModel。DataTemplate然后,为每个 ViewModel创建一个View。可以是自包含的DataTemplate,也可以只指向一个UserControl. 然后,您使用ContentPresenterDataBound 到 CurrentItem 属性或其他东西,当您将 CurrentItem 设置为特定的 ViewModel 时,WPF 将为DataTemplate您找到适当的(视图)并相应地显示它。

网上有几个演练可以证明这一点,StackOverflow 上也有几个这种模式的例子。一个似乎与您所要求的非常匹配的示例在这里:Switching between Views/UserControls using MVVM

于 2013-04-26T15:00:20.260 回答