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