Silverlight XAML属性定义顺序很重要

时间:2009-08-19 16:32:16

标签: silverlight-3.0

我正在使用ComboBox控件,无法从我的viewmodel上的属性中设置SelectedItem。以下是控件定义:

<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的设备与不设置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之前定义的,这使我相信至少在这种情况下,属性定义顺序很重要。我错过了什么或让别人发现这是真的吗?有没有记录在哪里?

3 个答案:

答案 0 :(得分:16)

是的顺序可以解决问题。考虑到XAML读取涉及对象的创建以及对这些对象的属性的值的赋值。它不可能同时分配属性值,显然将分配一个属性,然后分配另一个属性,然后分配另一个属性,直到分配所有属性。

由于在某些对象中分配属性会导致副作用,而其他代码运行时,分配这些属性的顺序会影响结果。这当然是件坏事。

答案 1 :(得分: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转换处理这个ComboBox元素(在某些情况下不是一个疯狂的想法),转换可能会改变顺序您的属性,即使它正在执行<xsl:copy-of>。 XSLT处理器可能不会这样做,但不需要

将XAML中每个元素的属性顺序随机化为应用程序的行为会产生什么影响?这个问题的答案应该是“没有。”

这是XAML的一个方面让我非常紧张。

答案 2 :(得分:2)

下次出现与此类似的问题时,您怀疑绑定可能因订单而失败。 检查输出窗口,它显示所有绑定错误,因此从该错误中可以推断出在绑定SelectedItem属性时ItemSource为null