【问题标题】:WPF Binding Overwrites Changes made in codeWPF 绑定覆盖代码中所做的更改
【发布时间】:2017-04-17 16:51:33
【问题描述】:

假设我在 OrderViewModel 类中创建一个ObservableCollection<Car>。 我还有一个 CarUserControl.xaml 文件。在类(CarUserControl.xaml.cs)后面的相应代码中,我有一行:

this.DataContext = new CarViewModel();

是否可以从 OrderViewModel 类中设置 CarUserControl 的 DataContext?

编辑:这是我之前问题的修改版本。

【问题讨论】:

  • 能贴出相关的XAML代码吗?
  • 能发一下CarViewModel的相关部分吗?
  • 您假设的机制是错误的。它不会替换您提供的实例。要么你在某处明确地给它另一个 Car 实例,要么你在 UI 中什么也看不到,因为你做错了绑定。显示足够的代码来重现问题,我会告诉你它是什么。顺便说一句,you 正在调用默认构造函数。
  • 我刚刚意识到这句话“当我运行代码时,我可以看到这个CarViewModel 实例已创建,但是属性CarViewModel.Car 为空。”具有误导性。该实例确实已创建,但未由绑定机制使用。似乎绑定通过调用默认构造函数然后尝试填充字段来创建一个新实例,但是它没有填充它们所需的信息。当然,我可能是错的。
  • "似乎绑定通过etc创建了一个新实例"。不,它没有。我告诉过你这不可能发生。如果你不听别人告诉你的话,你为什么在这里问问题?我告诉过你,你正在其他地方创造一个。布巴告诉你在哪里。

标签: c# wpf data-binding


【解决方案1】:

在 CarUserControl.xaml.cs 中,我只有一个实例使用 CarViewModel 的默认构造函数

您也在您的 xaml 文件中进行实例化。

<UserControl.DataContext>
     <local:CarViewModel/>
</UserControl.DataContext>

您没有绑定到代码中的任何位置的ObservableCollection&lt;CarViewModel&gt; list,而是绑定到您创建的新实例。

我发现绑定机制没有使用我刚刚创建的实例,而是使用 CarViewModel 的默认构造函数。

我不确定“不使用我刚刚创建的实例”是否指的是 ObservableCollection 中的实例。如果那是您想要做的,您应该绑定到集合。我不知道你的ObservableCollection&lt;CarViewModel&gt; list 在哪里,但你需要有CarUserControlDataContext 参考这个列表。

PS:你的代码并没有说明你实际上想要做什么。

【讨论】:

  • 对不起,这只是我拥有的代码的最小化版本。我的 ObservableCollection&lt;CarViewModel&gt; list 通过 ItemsSource="{Binding list}" 绑定到 ItemCollection。
  • 如果您的 ObservableCollection&lt;CarViewModel&gt; list 通过 ItemsSource="{Binding list}" 绑定到 ItemCollection,则无需在 CarUserControl 中设置 DataContext。
  • 谢谢!我实际上认为我需要在 CarUserControl 中指定 DataContext 以便绑定可以工作。现在我删除了它,它按预期工作!
【解决方案2】:

回答您修改后的问题:

是否可以从 OrderViewModel 类中设置 CarUserControl 的 DataContext?

不,不违反 MVVM 原则。 MVVM 的主要目的之一是实现关注点分离;视图模型保存并转换视图的数据,但视图模型应该对视图一无所知——它甚至不知道视图是否存在。因此,它不应该引用视图,也不能设置视图的数据上下文。

您没有具体说明为什么要这样做,因此很难为您提供解决方案。如果您提出一个新问题,可以提供一些指导。

【讨论】:

  • 我遇到的问题是我绑定了两个不同的 CarViewModel 实例,并且出现了意外行为。我想从 OrderViewModel 类中设置一个 DataContext,但没有意识到我根本不需要从 CarUserControl 中绑定它。不过,感谢您的努力!
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2017-10-02
  • 2018-07-17
相关资源
最近更新 更多