【发布时间】:2011-05-08 13:01:37
【问题描述】:
我有以下 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 事件触发而更新。初始值是正确的,但它永远不会改变。我想不出另一种方法来从列绑定中“退出”Items 绑定并备份到 ViewModel。
我认为在 WPF 中,您可以通过使用 FindAncestor 的 RelativeBinding 来执行此操作。但 Silverlight 中不存在该功能。还有其他方法可以做到这一点吗?
【问题讨论】:
-
+1 好问题!你现在也让我很好奇。您能否简单地确保属性名称不是您的项目源中存在的属性?我认为如果属性不是项目源的成员,它默认为视图模型。
-
你能提供一些你的源代码吗?我完全尝试了您的 xaml,它可以正常工作。也许您的一些 ViewModel 源代码将有助于定位问题。
-
@TerenceJackson:看起来你是对的。我重建了页面并且它起作用了。请参阅下面的答案。
标签: silverlight binding