【问题标题】:Dynamic views in WPFWPF 中的动态视图
【发布时间】:2013-04-26 14:40:08
【问题描述】:

我正在尝试动态更改在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});

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

我尝试过类似的方法:

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

我的主要问题是,有没有人尝试过实现类似的东西,你是如何解决的?

谢谢

【问题讨论】:

  • 这与 MVVM 所代表的一切背道而驰。您不应该在 ObservableCollection 中引用任何 UI 元素。而是创建一个ObservableCollection&lt;SomeViewModel&gt;,然后使用正确的DataTemplates 在屏幕上呈现这些。

标签: c# wpf view observablecollection


【解决方案1】:

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

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

网络上有几个演练演示了这一点,StackOverflow 上也有几个这种模式的示例。一个似乎与您所要求的非常匹配的示例如下:Switching between Views/UserControls using MVVM

【讨论】:

  • 感谢 Brian,这有助于我了解我的解决方案将如何以正确的方式工作。
  • @BrianS 以您分享的文章为例,如果带有 ContentPresenter 的 Window 有一个 ViewModel 并且该 ContentPresenter 负责显示 Views(每个都有自己的 ViewModels):1)Window 的 ViewModel获取/设置显示视图的视图模型的详细信息? 2) 如果是这样,如何与显示的 View 的 ViewModel “对话”?
  • @IsaiahNelson,抱歉,我从未对此作出回应,只是注意到您的问题。您可能已经得到了这个问题的答案,但是 1 和 2 的答案都是 DataBinding & INotifyPropertyChanged。 View 将 DataBind 到 ViewModel,这会导致 View 订阅属性更改(通过INotifyPropertyChangedINotifyCollectionChanged)。然后,通过在 ViewModel 上设置属性,视图会自动收到这些更改的通知,并将更新以反映新值。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多