将视图模型分配给数据上下文:视图模型何时覆盖XAML元素?

时间:2016-08-15 00:53:08

标签: c# wpf xaml mvvm

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

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

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

我假设XAML元素会从我的视图模型中提取所有值,但这不是正在发生的事情。对我的视图模型所做的更改会正确地通知和更新XAML元素。但是,在我设置DataContext之前所做的更改是而不是反映在XAML元素中。

有人能证实我的解释是正确的吗?我已经广泛搜索过,但在这个具体问题上找不到任何内容。然而,这似乎是我的应用程序中的行为。希望别人的观点或更详细的讨论链接。

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

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

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

1 个答案:

答案 0 :(得分: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的源