我有以下XAML:
<UserControl.Resources>
<local:MainPageViewModel x:Key="ViewModel" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot"
DataContext="{Binding Source={StaticResource ViewModel}}">
<sdk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="ID" Binding="{Binding ID}" />
<sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<sdk:DataGridCheckBoxColumn
Header="Checkbox Column"
Binding="{Binding Source={StaticResource ViewModel},
Path=SomeBooleanProperty}"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</Grid>
所以,基本上我想让一个列(复选框列)绑定到一个直接在ViewModel上的属性(SomeBooleanProperty),而不是Items集合中某个项目的属性。 (是的,这有点人为,但它解决了我的问题。)问题是,基于我的测试,如果你通过StaticResource绑定,似乎值不会根据INotifyPropertyChanged事件触发更新。初始值是正确的,但它永远不会改变。我无法找到另一种方法来从“物品”绑定中“取出”并从列绑定中备份到ViewModel。
我认为在WPF中你可以使用FindAncestor通过RelativeBinding来完成。但Silverlight中不存在该功能。还有其他方法可以实现这个目标吗?
答案 0 :(得分:3)
元素绑定不仅限于“控件”。您可以尝试将元素绑定到 LayoutRoot ,因为它在运行时仅基于当前范围中的名称进行解析。
然后它应该拾取你指向它的任何元素的DataContext。
e.g。
<sdk:DataGridCheckBoxColumn
Header="Checkbox Column"
Binding="{Binding ElementName=LayoutRoot,
Path=SomeBooleanProperty}"/>
如果绑定仍未触发,则它将是CheckBoxColumn的特征/缺陷(例如,它从行数据上下文中获取值)
答案 1 :(得分:0)
我真的不知道发生了什么。基于@TerenceJackson的评论说它对他有用,我完全重建了有问题的页面和VM代码,一切正常。我非常批判地看着这两段代码来找出不同的东西,但我做不到。所以虽然它让我感到烦恼,但我将不得不继续前进。我想我会留下这个问题,因为有人遇到同样的问题并且实际上找出原因是什么。