Silverlight - 从DataGrid列绑定到视图模型的root属性?

时间:2010-11-11 15:18:47

标签: silverlight binding

我有以下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中不存在该功能。还有其他方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

元素绑定不仅限于“控件”。您可以尝试将元素绑定到 LayoutRoot ,因为它在运行时仅基于当前范围中的名称进行解析。

然后它应该拾取你指向它的任何元素的DataContext。

e.g。

<sdk:DataGridCheckBoxColumn
                Header="Checkbox Column"
                Binding="{Binding ElementName=LayoutRoot,
                                  Path=SomeBooleanProperty}"/>

如果绑定仍未触发,则它将是CheckBoxColumn的特征/缺陷(例如,它从行数据上下文中获取值)

答案 1 :(得分:0)

我真的不知道发生了什么。基于@TerenceJackson的评论说它对他有用,我完全重建了有问题的页面和VM代码,一切正常。我非常批判地看着这两段代码来找出不同的东西,但我做不到。所以虽然它让我感到烦恼,但我将不得不继续前进。我想我会留下这个问题,因为有人遇到同样的问题并且实际上找出原因是什么。