【问题标题】:Assigning view model to data context: when does view model override XAML element?将视图模型分配给数据上下文:视图模型何时覆盖 XAML 元素?
【发布时间】:2023-03-07 19:16:02
【问题描述】:

我正在学习 WPF 和 MVVM。我很好奇在特定情况下会发生什么。

假设我的视图模型实现了INotifyPropertyChanged,情况是我的代码已经构建了我的视图模型,然后将它分配给我的窗口的DataContext

在我将视图模型分配给DataContext 的时间点,我的视图模型中的值可能与 XAML 元素中的值不同。所以我很好奇哪个值

我假设 XAML 元素会从我的视图模型中提取所有值,但事实并非如此。对我的视图模型所做的更改会正确通知和更新 XAML 元素。但是在我设置 DataContext 之前所做的那些更改没有反映在 XAML 元素中。

谁能确认我的解释是正确的?我已经广泛搜索,但在这个特定问题上找不到任何东西。然而,这似乎是我的应用程序中的行为。非常感谢其他人的观点或更详细讨论的链接。

我很好奇我的视图模型实现INotifyPropertyChanged的情况,我的代码构建了我的视图模型,然后将它分配给我的窗口DataContext

问题是,在我分配给DataContext 的那个阶段,XAML 元素中的值可能与我的视图模型不匹配。那么谁赢了。

根据我的测试,XAML 元素中已经存在的值似乎胜出。如果我想将它设置为我的视图模型中的值,我必须以某种方式设置它,或者让我的视图模型发送一个新的属性更改通知。

【问题讨论】:

  • 你能发布一个例子,展示你的绑定吗?
  • 设置绑定后,XAML 控件的属性如何保持任何值?没有<TextBlock Text="{Binding MyProperty}" Text="My default value" />这样的东西
  • @HeySatan:有很多代码。需要考虑如何重写它以适合此处的形式进行演示。
  • @Jai:我没有在 XAML 中设置属性值。但它似乎设置为null。当我附加我的数据上下文时,它似乎仍然设置为null,即使我的视图模型有数据。
  • 一旦设置了 DataContext,就应该重新评估绑定。你能举一个不会发生这种情况的简单例子吗?

标签: c# wpf xaml mvvm


【解决方案1】:

听起来您更改数据模板以显示硬编码值而不是绑定提供的默认值。

例如,在 TextBlock 中,您只能通过绑定语法(其中值源自 DataContext)或静态值来分配 Text 属性一次。

<TextBlock Text="{Binding Path=Display}"/> <- only uses the DataContext
<TextBlock Text="123"/> <- only shows the static value

如果您尝试设置 Text 属性两次,则会出现错误:

<TextBlock Text="{Binding Path=Display}">
  <TextBlock.Text>
    123
  </TextBlock.Text>
</TextBlock>

当通过 DataContext 没有可用的有效值(例如抛出异常)时,您可以为绑定提供回退值,但 DataContext 值在提供值时获胜:

<TextBlock Text="{Binding Path=Display, FallbackValue=123}" />

如果要设置默认值,最好在 DataContext 类的构造函数中设置默认值,并将 Xaml 中的绑定保留为仅来自 DataContext 的源

【讨论】:

  • 谢谢,但似乎不是这样。我在标记中没有默认值。如前所述,我可以更新我的数据并正确反映在控件中。并且没有错误。在我分配数据上下文时,它根本没有获取当前值。
  • 在应用数据上下文时是否会读取相关属性的 getter?
  • 抱歉,我一直无法弄清楚 WPF 到底是做什么的。我尝试设置断点,但后来我似乎得到了一系列的点击。超出我的预期。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多