2016-08-15 12 views
-2

我正在學習WPF和MVVM。我很好奇在特定情況下會發生什麼。將視圖模型分配給數據上下文:視圖模型何時覆蓋XAML元素?

假設我的視圖模型實現了INotifyPropertyChanged,情況是我的代碼已經構建了我的視圖模型,然後將其分配給我的窗口的DataContext

在我將視圖模型分配到DataContext時,我的視圖模型中的值可能與XAML元素中的值不同。所以我很好奇贏得了

我認爲XAML元素會從我的視圖模型中提取所有值,但這不是看起來正在發生的事情。對我的視圖模型所做的更改正確地通知並更新XAML元素。但在我設置DataContext之前所做的那些更改是而不是反映在XAML元素中。

任何人都可以證實我的解釋是正確的嗎?我已經Google廣泛搜索,但在這個特定問題上找不到任何東西。然而,這似乎是我的應用程序中的行爲。將欣賞別人的觀點或鏈接到更詳細的討論。

我很好奇我的視圖模型實現INotifyPropertyChanged,我的代碼構建我的視圖模型,然後將其分配給我的窗口DataContext

問題是,在我指定給DataContext的階段,XAML元素中的值可能與我的視圖模型不匹配。那麼哪一個贏。

根據我的測試,看起來XAML元素中的值已經贏了。如果我希望它設置爲我的視圖模型中的值,我必須設置它或讓我的視圖模型發送一個新的屬性更改通知。

+1

您可以發佈一個示例,顯示綁定嗎? – KnowHoper

+0

當你設置綁定時,你的XAML控件的屬性如何保持任何值?沒有'TextBlock Text =「{Binding MyProperty}」Text =「我的默認值」/>' – Jai

+0

@HeySatan:有很多代碼。這需要一些思考,我可以如何改寫它來以適合這裏的形式進行演示。 –

回答

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}" /> 

如果你想設置的默認值,你可能是最好設置一個默認的大的構造taContext類,並將Xaml中的綁定僅保留爲DataContext的源代碼

+0

謝謝,但似乎並非如此。我在標記中沒有默認值。如上所述,我可以更新我的數據,並且正確地反映在控件中。沒有錯誤。在分配數據上下文時,它根本不會提取當前值。 –

+0

在應用數據上下文時,有關屬性的獲取器是否被讀取? – benPearce

+0

對不起,我一直無法弄清楚WPF究竟做了什麼。我嘗試設置斷點,但是我似乎遇到了一連串的命中。超過我的預期。 –