【问题标题】:Change model instance at runtime?在运行时更改模型实例?
【发布时间】:2015-06-30 09:42:18
【问题描述】:

在运行时更改模型实例是否正确?我的控件绑定到第一个实例,但在程序执行期间我想将它们绑定到另一个实例。

ViewModel 类中的某个地方:

//ViewDefault - already initialized
// View - will be ready later

public string TextProperty
{
get
            {
                if (View != null)
                {
                    return View.Model.text;
                } return ViewDefault.Model.text;
            }
            set
            {
                 if(View != null)
                   {
                   //.. logic with View.Model.text
                   }else{
                      // logic with ViewDefault.Model.text
                   }
                   RaiseOnPropertyChanged("TextProperty");
}

问题是 - 我必须做什么来通知我的视图绑定内容已更改?

<Setter Property="Text" Value="{Binding MyViewModel.TextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

*ViewDefault.Model 和 View.Model 有一种类型

【问题讨论】:

  • 为什么要更改实例?

标签: c# wpf


【解决方案1】:

在我看来,ViewModelViewModel 链接起来,因此如果我必须更改Model,我将创建一个新的ViewModel 并将其附加到视图的DataContext。

视图应该由某人(最好是工厂)创建,创建视图的人也应该创建数据上下文并附加它

View view = new View();
view.DataContext = new ViewModel();

【讨论】:

  • 如何在运行时附加 View 的 DataContext(来自源代码)?它是预先在 xaml 中预定义的
  • 这几乎总是一个错误的决定。请检查我的更新答案
  • 我会disagree:viewmodel 主要服务于view。单个 ViewModel 可以处理多个模型。每个视图有多个 ViewModel 的想法闻起来对我来说很糟糕。 View 使用绑定来绑定到 ViewModel 中的属性。返回什么属性(ModelA 属性或 ModelB 属性)- 对于视图 无关紧要。另外,绑定DataSource in xaml也没什么不好。这两个原因以及答案的非常抽象性质让我想对答案投反对票。要不要?
  • 您可以在更改模型时重新计算所有视图模型属性,但创建新视图模型似乎更容易。更改它将刷新所有绑定,以便找到。另一方面,向 xaml 添加逻辑是一个坏主意,因为您正在向视图添加逻辑(视图模型创建)。这有几个问题,你正在打破界限,混合责任,你不能测试或调试视图模型的创建等等。
  • 我之前已经多次刷新了属性值,但其他解决方案在大多数情况下更简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多