代码之家  ›  专栏  ›  技术社区  ›  DaveB

Silverlight XAML属性定义顺序重要

  •  15
  • DaveB  · 技术社区  · 15 年前

    我正在使用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"/>
    

    我有另一个组合框控件,它工作得很好。设置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"/>
    

    两者之间的区别在于,itemssource是在工作项的selectedItem之前定义的,这让我相信在这种情况下,至少属性定义顺序很重要。我是错过了什么,还是别人发现这是真的?有没有记录在案?

    3 回复  |  直到 15 年前
        1
  •  16
  •   AnthonyWJones    15 年前

    是的,秩序很重要。考虑到XAML读取涉及对象的创建和这些对象的属性值的分配。同时分配属性值是不可能的,很明显,在分配所有属性之前,将先分配一个属性,然后分配另一个属性。

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

        2
  •  5
  •   Robert Rossney    15 年前

    在任何设置属性的顺序很重要的情况下,都应该使用元素语法而不是属性语法来表示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工具不需要保留它们的显示顺序。例如,如果你处理了这个 ComboBox 元素与一个XSLT转换(在某些情况下不是一个疯狂的想法),转换可能会改变属性的顺序,即使它正在做 <xsl:copy-of> . XSLT处理器 可能 不会的,但不需要 去。

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

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

        3
  •  2
  •   Neil    15 年前

    下次当您遇到类似这样的问题时,您怀疑绑定可能会因为顺序而失败。 检查输出窗口,它显示所有绑定错误,因此根据该错误,您可以推断在绑定SelectedItem属性时,itemsource为空。

    推荐文章