2009-08-19 64 views
12

我正在使用ComboBox控件,無法從ViewModel的屬性中設置SelectedItem。這裏是控制定義:Silverlight XAML屬性定義Order Matters

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    DisplayMemberPath="FullName"/> 

我有另一個工作得很好的Combobox控件。 SelectedItem設置和不設置屬性定義的順序之間的區別。這裏是工作的控制定義:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" 
    ItemsSource="{Binding Path=Employees, Mode=OneWay}" 
    SelectedItem="{Binding Path=EditingJob.Employee, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
    DisplayMemberPath="FullName"/> 

2之間的區別是,的ItemsSource是的SelectedItem之前的工作其中一個讓我相信定義,在這種情況下,至少,屬性定義順序問題。我是否錯過了某些東西或者是否有其他人發現這是真的?它是否被記錄在任何地方?

回答

15

是訂單可以重要。考慮到XAML讀取涉及創建對象並將值分配給這些對象的屬性。它不可能同時分配屬性值,顯然一個屬性將被分配,然後是另一個屬性,然後是另一個屬性,直到分配所有屬性。

由於在某些對象中分配屬性導致副作用,而其他代碼運行分配這些屬性的順序會影響結果。這當然是一件壞事。

+0

在這種情況下,如果首先不存在列表中的項目,則無法選擇列表中的項目是有意義的。在編寫Silverlight XAML時需要注意這一點。也許像Expression Blend這樣的工具可以確保按照正確的順序定義屬性? – DaveB 2009-08-20 17:44:30

+0

@DaveB:我不確定它確實如此,我不得不親自測試這個場景。在我迄今爲止的典型用法中,將數據上下文分配給某個祖先的時間晚於兩個屬性中的任何一個,在這種情況下,分配這些屬性的順序並不重要。 – AnthonyWJones 2009-08-20 21:21:43

+0

指導方針聲明: 「DO允許以任何順序設置屬性,即使這會導致對象的臨時無效狀態。」 https://msdn.microsoft.com/en-us/library/ms229006%28v=vs.110%29.aspx?f = 255&MSPPError = -2147217396 – Wouter 2017-05-29 12:49:42

2

下次您遇到與此類似的問題時,您懷疑綁定可能因訂單而失敗。 檢查你的輸出窗口,它顯示所有綁定錯誤,所以從這個錯誤你可以推斷ItemSource在綁定SelectedItem屬性時是空的

+0

這是一個很好的觀點。我甚至沒有想到要去那裏看。 – DaveB 2009-08-22 03:32:59

5

在任何情況下,設置屬性的順序都很重要,你應該使用元素語法,沒有屬性語法,在您的XAML來表示這些屬性:

<ComboBox x:Name="jobEmployee" Grid.Column="1" Grid.Row="2" 
    Margin="4" HorizontalAlignment="Left" Width="150" DisplayMemberPath="FullName"> 
    <ComboBox.ItemsSource> 
     <Binding Path="Employees" Mode="OneWay"/> 
    <ComboBox.ItemsSource> 
    <ComboBox.SelectedItem> 
     <Binding Path="EditingJob.Employee" Mode="TwoWay" 
     ValidatesOnExceptions="true" NotifyOnValidationError="true"/> 
    </ComboBox.SelectedItem> 
</ComboBox> 

根據XML推薦,屬性的元素的順序並不顯著。 XML工具不需要保留它們出現的順序。因此,例如,如果您使用XSLT轉換(在某些情況下不是瘋狂的想法)處理此元素,則該轉換可能會更改您的屬性的排序,甚至如果它在做<xsl:copy-of>。 XSLT處理器可能不會這樣做,但它不是必需的而不是

隨機化XAML中每個元素的屬性順序對應用程序的行爲有什麼影響?這個問題的答案應該是「沒有」。

這是XAML的一個方面,讓我非常緊張。